From 672407460eb264edddbe8aa2efc5b1b89a083ba3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 12 Mar 2024 00:50:45 +0000 Subject: [PATCH] Rebuild pages at b59bb0e74a24e4de296c66b6c628b75bd7117989 --- .../authorship.json | 2 +- AY2324S2-CS2103-F15-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F12-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F12-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T08-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T10-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T12-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T15-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T16-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W08-3_tp_master/commits.json | 2 +- archive.zip | Bin 3163770 -> 3238241 bytes reposense-logs/reposense.log.0 | 2800 ++++++++--------- summary.json | 2 +- 21 files changed, 1419 insertions(+), 1419 deletions(-) diff --git a/AY2324S2-CS2103-F15-2_tp_master/authorship.json b/AY2324S2-CS2103-F15-2_tp_master/authorship.json index d8e5edaf..de713b2e 100644 --- a/AY2324S2-CS2103-F15-2_tp_master/authorship.json +++ b/AY2324S2-CS2103-F15-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Hwww23"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F15-2/tp/actions)","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Hwww23"},"content":"* The project simulates an ongoing software project for a desktop application (called _TutorsGo_) used for managing students of a tutor.","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Hwww23"},"content":"* It is named `TutorsGo` to represent efficient tutors ready to be on the go.","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Hwww23"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Hwww23":4,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"Hwww23"},"content":"### Tang Hao Wen","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Hwww23"},"content":"\u003cimg src\u003d\"images/hwww23.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Hwww23"},"content":"[[github](https://github.com/hwww23)]","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Hwww23"},"content":"* Role: Integration","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Hwww23"},"content":"* Responsibilities: Schedule","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"AL-ZT"},"content":"### Lim Zheng Ting","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"AL-ZT"},"content":"\u003cimg src\u003d\"images/al-zt.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"AL-ZT"},"content":"[[github](http://github.com/AL-ZT)]","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"AL-ZT"},"content":"* Role: Integration","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"AL-ZT"},"content":"* Responsibilities: Payment","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"zoebelle-pang"},"content":"### Zoebelle Pang","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"zoebelle-pang"},"content":"\u003cimg src\u003d\"images/zoebelle-pang.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"zoebelle-pang"},"content":"### Gowthaman aravindan","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"zoebelle-pang"},"content":"\u003cimg src\u003d\"images/gowthaman-aravindan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"zoebelle-pang":4,"AL-ZT":5,"Hwww23":5,"-":35}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"AL-ZT"},"content":"* Tech-savvy tutors who:","lastModifiedDate":"2024-03-04"},{"lineNumber":266,"author":{"gitId":"-"},"content":" * has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" * prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" * can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" * prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":" * is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"AL-ZT"},"content":"**Value proposition**: Allows tutors to view details of students that they are currently teaching, in a simple GUI application that favors CLI experience.","lastModifiedDate":"2024-03-04"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"AL-ZT"},"content":"|---------|-----------|---------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":281,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | new tutor | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-04"},{"lineNumber":282,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | add a new tutor | manage the new tutor\u0027s schedule |","lastModifiedDate":"2024-03-04"},{"lineNumber":283,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | delete a student | remove entries that I no longer need |","lastModifiedDate":"2024-03-04"},{"lineNumber":284,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | find a student by name | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-03-04"},{"lineNumber":285,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | add a student | register a student for tutoring |","lastModifiedDate":"2024-03-04"},{"lineNumber":286,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | list all students | view all registered students |","lastModifiedDate":"2024-03-04"},{"lineNumber":287,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | edit details of a student | update whenever their contact details changes |","lastModifiedDate":"2024-03-04"},{"lineNumber":288,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | edit my own details | update whenever my contact details changes |","lastModifiedDate":"2024-03-04"},{"lineNumber":289,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | filter my students by subject / grade level | tailor my teaching approach according to students\u0027 needs |","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | mark students\u0027 monthly payments | keep track of any payments left unpaid |","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | view all outstanding payments | remind their parents of their tuition fees |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | sort the students by grade level | tailor my teaching approach according to students\u0027 needs |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | view my schedules | get to the appointed lessons on time |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | get reminders incoming weekly sessions | remember my upcoming lessons |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | communicate with my students on the App | update them on any academic details I missed during lessons |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | track attendence of students | monitor their commitment to tutoring sessions |","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | reschedule sessions with my students | accomodate changes in availability |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | make session notes for students | keep track of lesson details |","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"AL-ZT"},"content":"(For all use cases below, the **System** is the `TutorsGo` and the **Actor** is the `tutor`, unless specified otherwise)","lastModifiedDate":"2024-03-11"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":306,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":307,"author":{"gitId":"AL-ZT"},"content":"**Use case: Adding a person**","lastModifiedDate":"2024-03-11"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":309,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-11"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":311,"author":{"gitId":"AL-ZT"},"content":"1. User adds a person","lastModifiedDate":"2024-03-11"},{"lineNumber":312,"author":{"gitId":"AL-ZT"},"content":"2. TutorsGo shows a success message.","lastModifiedDate":"2024-03-11"},{"lineNumber":313,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":314,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":315,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":316,"author":{"gitId":"AL-ZT"},"content":"**Extensions**","lastModifiedDate":"2024-03-11"},{"lineNumber":317,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":318,"author":{"gitId":"AL-ZT"},"content":"* 1a. Parameters given are invalid.","lastModifiedDate":"2024-03-11"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"AL-ZT"},"content":" * 1a1. TutorsGo shows an error message.","lastModifiedDate":"2024-03-11"},{"lineNumber":321,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":322,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":323,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":324,"author":{"gitId":"AL-ZT"},"content":"* 1b. The tag given is not a `Student` or a `Tutor`.","lastModifiedDate":"2024-03-11"},{"lineNumber":325,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":326,"author":{"gitId":"AL-ZT"},"content":" * 1b1. TutorsGo shows an error message.","lastModifiedDate":"2024-03-11"},{"lineNumber":327,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":328,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":329,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":330,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":331,"author":{"gitId":"AL-ZT"},"content":"**Use case: View schedule**","lastModifiedDate":"2024-03-11"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"AL-ZT"},"content":"1. User requests to view schedule","lastModifiedDate":"2024-03-11"},{"lineNumber":335,"author":{"gitId":"AL-ZT"},"content":"2. TutorsGo shows upcoming schedule of current month","lastModifiedDate":"2024-03-11"},{"lineNumber":336,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":337,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":338,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":339,"author":{"gitId":"AL-ZT"},"content":"**Use case: Track attendance**","lastModifiedDate":"2024-03-11"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"AL-ZT"},"content":"**MSS**","lastModifiedDate":"2024-03-11"},{"lineNumber":342,"author":{"gitId":"AL-ZT"},"content":"1. User requests to list students","lastModifiedDate":"2024-03-11"},{"lineNumber":343,"author":{"gitId":"AL-ZT"},"content":"2. TutorsGo shows a list of students","lastModifiedDate":"2024-03-11"},{"lineNumber":344,"author":{"gitId":"AL-ZT"},"content":"3. User requests to track attendance of a specific person in the list","lastModifiedDate":"2024-03-11"},{"lineNumber":345,"author":{"gitId":"AL-ZT"},"content":"4. TutorsGo shows all dates student has attended","lastModifiedDate":"2024-03-11"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"AL-ZT"},"content":" * 3a1. TutorsGo shows an error message.","lastModifiedDate":"2024-03-11"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"Hwww23"},"content":"4. Should handle errors without crashing","lastModifiedDate":"2024-03-11"},{"lineNumber":369,"author":{"gitId":"Hwww23"},"content":"5. Should be able to function in offline environments","lastModifiedDate":"2024-03-11"},{"lineNumber":370,"author":{"gitId":"Hwww23"},"content":"6. Command names should be clear and well-defined","lastModifiedDate":"2024-03-11"},{"lineNumber":371,"author":{"gitId":"Hwww23"},"content":"7. Error messages should clearly state issues or propose solution","lastModifiedDate":"2024-03-11"},{"lineNumber":372,"author":{"gitId":"Hwww23"},"content":"8. Should be used by a single user","lastModifiedDate":"2024-03-11"},{"lineNumber":373,"author":{"gitId":"Hwww23"},"content":"9. Should still work on CLI if there is no GUI.","lastModifiedDate":"2024-03-11"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":380,"author":{"gitId":"Hwww23"},"content":"* **CLI**: Command line interface","lastModifiedDate":"2024-03-11"},{"lineNumber":381,"author":{"gitId":"Hwww23"},"content":"* **GUI**: Graphical user interface","lastModifiedDate":"2024-03-11"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AL-ZT":56,"Hwww23":8,"-":370}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"AL-ZT"},"content":"### Mark student\u0027s payment: `mark_payment`","lastModifiedDate":"2024-03-01"},{"lineNumber":145,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":146,"author":{"gitId":"AL-ZT"},"content":"Marks completion of monthly tuition fees for a specified student from the address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":147,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":148,"author":{"gitId":"AL-ZT"},"content":"Format: `mark_payment INDEX`","lastModifiedDate":"2024-03-01"},{"lineNumber":149,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":150,"author":{"gitId":"AL-ZT"},"content":"* Marks payment of student at the specified `INDEX`","lastModifiedDate":"2024-03-01"},{"lineNumber":151,"author":{"gitId":"AL-ZT"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-01"},{"lineNumber":152,"author":{"gitId":"AL-ZT"},"content":"* The index **must be a positive integer** 1,2,3, ...","lastModifiedDate":"2024-03-01"},{"lineNumber":153,"author":{"gitId":"AL-ZT"},"content":"* It is encouraged to use the [find](#locating-persons-by-name-find) command to search for a particular student for his/her index.","lastModifiedDate":"2024-03-01"},{"lineNumber":154,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":155,"author":{"gitId":"AL-ZT"},"content":"Examples:","lastModifiedDate":"2024-03-01"},{"lineNumber":156,"author":{"gitId":"AL-ZT"},"content":"* `find john doe` returns `John Doe` with an index 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":157,"author":{"gitId":"AL-ZT"},"content":"* `mark_payment 2` will return this success message, when `John Doe` has outstanding fees. \u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":158,"author":{"gitId":"AL-ZT"},"content":" ![\u0027mark_payment 2\u0027 on success](images/paymentJohnDoeSuccess.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":159,"author":{"gitId":"AL-ZT"},"content":"* Otherwise, if `John Doe` does not have any fees due, it would return a failure message. \u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":160,"author":{"gitId":"AL-ZT"},"content":" ![\u0027mark_payment 2\u0027 on failure](images/paymentJohnDoeFailure.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":161,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":162,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":163,"author":{"gitId":"AL-ZT"},"content":"### View outstanding payments: `payment_list`","lastModifiedDate":"2024-03-01"},{"lineNumber":164,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":165,"author":{"gitId":"AL-ZT"},"content":"View any outstanding payments from students for the month.","lastModifiedDate":"2024-03-01"},{"lineNumber":166,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":167,"author":{"gitId":"AL-ZT"},"content":"Format: `payment_list`","lastModifiedDate":"2024-03-01"},{"lineNumber":168,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":169,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":189,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-02-09"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":194,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":209,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":211,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":213,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"AL-ZT"},"content":"**Mark payment**|`mark_payment INDEX` \u003cbr\u003e e.g. `mark_payment 2`","lastModifiedDate":"2024-03-04"},{"lineNumber":225,"author":{"gitId":"AL-ZT"},"content":"**payment_list**|`payment_list`","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"AL-ZT":27,"-":198}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"AL-ZT"},"content":" content: \"TutorsGo\";","lastModifiedDate":"2024-03-01"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"AL-ZT":1,"-":294}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"AL-ZT"},"content":"title: TutorsGo","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"AL-ZT"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F15-2/tp/actions)","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"AL-ZT"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F15-2/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2324S2-CS2103-F15-2/tp)","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"AL-ZT"},"content":"**TutorsGo is a desktop application for tutors managing their student details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"AL-ZT"},"content":"* If you are interested in using TutorsGo, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"AL-ZT"},"content":"* If you are interested about developing TutorsGo, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"AL-ZT"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AL-ZT":7,"-":13}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Hwww23"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F15-2/tp/actions)","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Hwww23"},"content":"* The project simulates an ongoing software project for a desktop application (called _TutorsGo_) used for managing students of a tutor.","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Hwww23"},"content":"* It is named `TutorsGo` to represent efficient tutors ready to be on the go.","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Hwww23"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Hwww23":4,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"Hwww23"},"content":"### Tang Hao Wen","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Hwww23"},"content":"\u003cimg src\u003d\"images/hwww23.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Hwww23"},"content":"[[github](https://github.com/hwww23)]","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Hwww23"},"content":"* Role: Integration","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Hwww23"},"content":"* Responsibilities: Schedule","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"AL-ZT"},"content":"### Lim Zheng Ting","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"AL-ZT"},"content":"\u003cimg src\u003d\"images/al-zt.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"AL-ZT"},"content":"[[github](http://github.com/AL-ZT)]","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"AL-ZT"},"content":"* Role: Integration","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"AL-ZT"},"content":"* Responsibilities: Payment","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"zoebelle-pang"},"content":"### Zoebelle Pang","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"zoebelle-pang"},"content":"\u003cimg src\u003d\"images/zoebelle-pang.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"AL-ZT"},"content":"[[github](http://github.com/zoebelle-pang)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"AL-ZT"},"content":"### Gowthaman Aravindan","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"AL-ZT"},"content":"\u003cimg src\u003d\"images/gowthaman-01.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"AL-ZT"},"content":"[[github](http://github.com/gowthaman-01)]","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"zoebelle-pang":2,"AL-ZT":9,"Hwww23":5,"-":33}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"AL-ZT"},"content":"* Tech-savvy tutors who:","lastModifiedDate":"2024-03-04"},{"lineNumber":266,"author":{"gitId":"-"},"content":" * has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" * prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" * can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" * prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":" * is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"AL-ZT"},"content":"**Value proposition**: Allows tutors to view details of students that they are currently teaching, in a simple GUI application that favors CLI experience.","lastModifiedDate":"2024-03-04"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"AL-ZT"},"content":"|---------|-----------|---------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":281,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | new tutor | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-04"},{"lineNumber":282,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | add a new tutor | manage the new tutor\u0027s schedule |","lastModifiedDate":"2024-03-04"},{"lineNumber":283,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | delete a student | remove entries that I no longer need |","lastModifiedDate":"2024-03-04"},{"lineNumber":284,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | find a student by name | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-03-04"},{"lineNumber":285,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | add a student | register a student for tutoring |","lastModifiedDate":"2024-03-04"},{"lineNumber":286,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | list all students | view all registered students |","lastModifiedDate":"2024-03-04"},{"lineNumber":287,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | edit details of a student | update whenever their contact details changes |","lastModifiedDate":"2024-03-04"},{"lineNumber":288,"author":{"gitId":"AL-ZT"},"content":"| `* * *` | tutor | edit my own details | update whenever my contact details changes |","lastModifiedDate":"2024-03-04"},{"lineNumber":289,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | filter my students by subject / grade level | tailor my teaching approach according to students\u0027 needs |","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | mark students\u0027 monthly payments | keep track of any payments left unpaid |","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | view all outstanding payments | remind their parents of their tuition fees |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | sort the students by grade level | tailor my teaching approach according to students\u0027 needs |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | view my schedules | get to the appointed lessons on time |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"AL-ZT"},"content":"| `* *` | tutor | get reminders incoming weekly sessions | remember my upcoming lessons |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | communicate with my students on the App | update them on any academic details I missed during lessons |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | track attendence of students | monitor their commitment to tutoring sessions |","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | reschedule sessions with my students | accomodate changes in availability |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"AL-ZT"},"content":"| `*` | tutor | make session notes for students | keep track of lesson details |","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"AL-ZT"},"content":"(For all use cases below, the **System** is the `TutorsGo` and the **Actor** is the `tutor`, unless specified otherwise)","lastModifiedDate":"2024-03-11"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":306,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":307,"author":{"gitId":"AL-ZT"},"content":"**Use case: Adding a person**","lastModifiedDate":"2024-03-11"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":309,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-11"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":311,"author":{"gitId":"AL-ZT"},"content":"1. User adds a person","lastModifiedDate":"2024-03-11"},{"lineNumber":312,"author":{"gitId":"AL-ZT"},"content":"2. TutorsGo shows a success message.","lastModifiedDate":"2024-03-11"},{"lineNumber":313,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":314,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":315,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":316,"author":{"gitId":"AL-ZT"},"content":"**Extensions**","lastModifiedDate":"2024-03-11"},{"lineNumber":317,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":318,"author":{"gitId":"AL-ZT"},"content":"* 1a. Parameters given are invalid.","lastModifiedDate":"2024-03-11"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"AL-ZT"},"content":" * 1a1. TutorsGo shows an error message.","lastModifiedDate":"2024-03-11"},{"lineNumber":321,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":322,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":323,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":324,"author":{"gitId":"AL-ZT"},"content":"* 1b. The tag given is not a `Student` or a `Tutor`.","lastModifiedDate":"2024-03-11"},{"lineNumber":325,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":326,"author":{"gitId":"AL-ZT"},"content":" * 1b1. TutorsGo shows an error message.","lastModifiedDate":"2024-03-11"},{"lineNumber":327,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":328,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":329,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":330,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":331,"author":{"gitId":"AL-ZT"},"content":"**Use case: View schedule**","lastModifiedDate":"2024-03-11"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"AL-ZT"},"content":"1. User requests to view schedule","lastModifiedDate":"2024-03-11"},{"lineNumber":335,"author":{"gitId":"AL-ZT"},"content":"2. TutorsGo shows upcoming schedule of current month","lastModifiedDate":"2024-03-11"},{"lineNumber":336,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":337,"author":{"gitId":"AL-ZT"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":338,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":339,"author":{"gitId":"AL-ZT"},"content":"**Use case: Track attendance**","lastModifiedDate":"2024-03-11"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"AL-ZT"},"content":"**MSS**","lastModifiedDate":"2024-03-11"},{"lineNumber":342,"author":{"gitId":"AL-ZT"},"content":"1. User requests to list students","lastModifiedDate":"2024-03-11"},{"lineNumber":343,"author":{"gitId":"AL-ZT"},"content":"2. TutorsGo shows a list of students","lastModifiedDate":"2024-03-11"},{"lineNumber":344,"author":{"gitId":"AL-ZT"},"content":"3. User requests to track attendance of a specific person in the list","lastModifiedDate":"2024-03-11"},{"lineNumber":345,"author":{"gitId":"AL-ZT"},"content":"4. TutorsGo shows all dates student has attended","lastModifiedDate":"2024-03-11"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"AL-ZT"},"content":" * 3a1. TutorsGo shows an error message.","lastModifiedDate":"2024-03-11"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"Hwww23"},"content":"4. Should handle errors without crashing","lastModifiedDate":"2024-03-11"},{"lineNumber":369,"author":{"gitId":"Hwww23"},"content":"5. Should be able to function in offline environments","lastModifiedDate":"2024-03-11"},{"lineNumber":370,"author":{"gitId":"Hwww23"},"content":"6. Command names should be clear and well-defined","lastModifiedDate":"2024-03-11"},{"lineNumber":371,"author":{"gitId":"Hwww23"},"content":"7. Error messages should clearly state issues or propose solution","lastModifiedDate":"2024-03-11"},{"lineNumber":372,"author":{"gitId":"Hwww23"},"content":"8. Should be used by a single user","lastModifiedDate":"2024-03-11"},{"lineNumber":373,"author":{"gitId":"Hwww23"},"content":"9. Should still work on CLI if there is no GUI.","lastModifiedDate":"2024-03-11"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":380,"author":{"gitId":"Hwww23"},"content":"* **CLI**: Command line interface","lastModifiedDate":"2024-03-11"},{"lineNumber":381,"author":{"gitId":"Hwww23"},"content":"* **GUI**: Graphical user interface","lastModifiedDate":"2024-03-11"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AL-ZT":56,"Hwww23":8,"-":370}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"AL-ZT"},"content":"### Mark student\u0027s payment: `mark_payment`","lastModifiedDate":"2024-03-01"},{"lineNumber":145,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":146,"author":{"gitId":"AL-ZT"},"content":"Marks completion of monthly tuition fees for a specified student from the address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":147,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":148,"author":{"gitId":"AL-ZT"},"content":"Format: `mark_payment INDEX`","lastModifiedDate":"2024-03-01"},{"lineNumber":149,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":150,"author":{"gitId":"AL-ZT"},"content":"* Marks payment of student at the specified `INDEX`","lastModifiedDate":"2024-03-01"},{"lineNumber":151,"author":{"gitId":"AL-ZT"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-01"},{"lineNumber":152,"author":{"gitId":"AL-ZT"},"content":"* The index **must be a positive integer** 1,2,3, ...","lastModifiedDate":"2024-03-01"},{"lineNumber":153,"author":{"gitId":"AL-ZT"},"content":"* It is encouraged to use the [find](#locating-persons-by-name-find) command to search for a particular student for his/her index.","lastModifiedDate":"2024-03-01"},{"lineNumber":154,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":155,"author":{"gitId":"AL-ZT"},"content":"Examples:","lastModifiedDate":"2024-03-01"},{"lineNumber":156,"author":{"gitId":"AL-ZT"},"content":"* `find john doe` returns `John Doe` with an index 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":157,"author":{"gitId":"AL-ZT"},"content":"* `mark_payment 2` will return this success message, when `John Doe` has outstanding fees. \u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":158,"author":{"gitId":"AL-ZT"},"content":" ![\u0027mark_payment 2\u0027 on success](images/paymentJohnDoeSuccess.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":159,"author":{"gitId":"AL-ZT"},"content":"* Otherwise, if `John Doe` does not have any fees due, it would return a failure message. \u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":160,"author":{"gitId":"AL-ZT"},"content":" ![\u0027mark_payment 2\u0027 on failure](images/paymentJohnDoeFailure.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":161,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":162,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":163,"author":{"gitId":"AL-ZT"},"content":"### View outstanding payments: `payment_list`","lastModifiedDate":"2024-03-01"},{"lineNumber":164,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":165,"author":{"gitId":"AL-ZT"},"content":"View any outstanding payments from students for the month.","lastModifiedDate":"2024-03-01"},{"lineNumber":166,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":167,"author":{"gitId":"AL-ZT"},"content":"Format: `payment_list`","lastModifiedDate":"2024-03-01"},{"lineNumber":168,"author":{"gitId":"AL-ZT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":169,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":189,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-02-09"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":194,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":209,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":211,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":213,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"AL-ZT"},"content":"**Mark payment**|`mark_payment INDEX` \u003cbr\u003e e.g. `mark_payment 2`","lastModifiedDate":"2024-03-04"},{"lineNumber":225,"author":{"gitId":"AL-ZT"},"content":"**payment_list**|`payment_list`","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"AL-ZT":27,"-":198}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"AL-ZT"},"content":" content: \"TutorsGo\";","lastModifiedDate":"2024-03-01"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"AL-ZT":1,"-":294}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"AL-ZT"},"content":"title: TutorsGo","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"AL-ZT"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F15-2/tp/actions)","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"AL-ZT"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F15-2/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2324S2-CS2103-F15-2/tp)","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"AL-ZT"},"content":"**TutorsGo is a desktop application for tutors managing their student details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"AL-ZT"},"content":"* If you are interested in using TutorsGo, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"AL-ZT"},"content":"* If you are interested about developing TutorsGo, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"AL-ZT"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AL-ZT":7,"-":13}}] diff --git a/AY2324S2-CS2103-F15-2_tp_master/commits.json b/AY2324S2-CS2103-F15-2_tp_master/commits.json index 7e0a311f..f1b8aaf9 100644 --- a/AY2324S2-CS2103-F15-2_tp_master/commits.json +++ b/AY2324S2-CS2103-F15-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"zoebelle-pang":[{"date":"2024-03-11","commitResults":[{"hash":"f2e419db23e7c13f045fbd6c55e542b8b3537afd","isMergeCommit":false,"messageTitle":"Add profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]}],"AL-ZT":[{"date":"2024-03-01","commitResults":[{"hash":"7347d212c9ef64d45b634a572023b2f4b9b69957","isMergeCommit":false,"messageTitle":"Update Zheng Ting\u0027s Profile in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"478b5a4c32f1eabcd8ae66e94052a05ab16b43b7","isMergeCommit":false,"messageTitle":"Update payment functionality in User Guide.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":0}}},{"hash":"cbf7b777d4734872b6632cd7fbff7c4f7559686c","isMergeCommit":false,"messageTitle":"Hyperlink fix for mark_payment","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f59c8d682dc362972628c092d047a0a1f96dc152","isMergeCommit":false,"messageTitle":"Change site-wide settings for TutorsGo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"1e5de123d9a1c79a1c3cf06ca3946ac17620d928","isMergeCommit":false,"messageTitle":"Minor Fix","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}}]},{"date":"2024-03-04","commitResults":[{"hash":"27dd34d30c683b78ad5c64ff1529dad2dbcba7ce","isMergeCommit":false,"messageTitle":"Syntax fix","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"44518a82d7fbb2bfbebceb235d19e60066738024","isMergeCommit":false,"messageTitle":"Minor fix to sentences","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"00b5d32183f8d086e0c6084ee53a5e61b0441c21","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Updates to target user profile, value proposition and user stories appended in Developer Guide.\n","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":14}}}]},{"date":"2024-03-11","commitResults":[{"hash":"0ae6b7fbfb1b76fe402587a15c481538c538b3b0","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Hwww23/add-profile","messageBody":"Update Haowen\u0027s profile in AboutUs","fileTypesAndContributionMap":{}},{"hash":"30af7ee0958b22442241f5e38b04848cf29fb043","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Hwww23/update-readme","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"74c813365b6d07e4c5eb31e150ac6ad391f6abe2","isMergeCommit":true,"messageTitle":"Merge pull request #35 from Hwww23/update-readme","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"2d70afde07269769bd7200a0e59b02a68ea1e074","isMergeCommit":false,"messageTitle":"Update use cases in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":10}}},{"hash":"b3310ad52d418b11f9e0a1ca28964874de339934","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-developer-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5cd57b5838abb37f57da16d74cbab3a52f881bc1","isMergeCommit":true,"messageTitle":"Merge pull request #36 from zoebelle-pang/profilepic","messageBody":"Add profile picture","fileTypesAndContributionMap":{}},{"hash":"89a9ee3cdaa9ebedfcb9eb83fec0c9a4b4208ad4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-developer-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a641bc7f842182955989615d79a44a2a509916fa","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Hwww23/update-DG","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"2f0bae8233fbf18c34d1e65f6d38d4ea2e0abec9","isMergeCommit":true,"messageTitle":"Merge pull request #39 from Hwww23/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"gowthaman-01":[],"Hwww23":[{"date":"2024-03-11","commitResults":[{"hash":"0c272ad964199eca19d0a3ed63dd7c0c911abe89","isMergeCommit":false,"messageTitle":"Update AboutUs.md and Add hwww23.png","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"955fe0b025234d8f8ce0159708b11bc8ab9e78d4","isMergeCommit":true,"messageTitle":"Merge pull request #6 from AL-ZT/add-alzt-info","messageBody":"Update Zheng Ting\u0027s Profile in AboutUs","fileTypesAndContributionMap":{}},{"hash":"dce25f1c6e85ebe43877abc2521177ee561ebf50","isMergeCommit":true,"messageTitle":"Merge pull request #8 from AL-ZT/add-user-guide","messageBody":"Update payment functionality in User Guide","fileTypesAndContributionMap":{}},{"hash":"91c5d7158dfc5c1c9462c9cfec763df591f8ec2c","isMergeCommit":true,"messageTitle":"Merge pull request #10 from AL-ZT/change-site-wide-settings","messageBody":"Changes to site-wide settings","fileTypesAndContributionMap":{}},{"hash":"116481e582a424cb2a72493fa227d7f080735059","isMergeCommit":true,"messageTitle":"Merge pull request #15 from AL-ZT/update-developer-guide","messageBody":"Update target user profile, value proposition and user stories in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"6daad9b7f85ead216395af6153230dd0b48df965","isMergeCommit":false,"messageTitle":"Update READEME.md and Ui.png","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":7}}},{"hash":"baa1f350e88756c9a1af04ef3663d42aaf509e87","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Minor changes to remove presence of ab3\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c95b3b7c2eb3fc923855648fb0e01c0f65eaa6ec","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Add more NFRs\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":0}}},{"hash":"384cf3844e30942d520cb0717dbd658a28556910","isMergeCommit":true,"messageTitle":"Merge pull request #37 from AL-ZT/update-developer-guide","messageBody":"Update use cases in DG","fileTypesAndContributionMap":{}},{"hash":"850fa4feb098107627e66f9cbda36ce2166315f5","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Update glossary\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}},{"hash":"db7a5245ec28ad8df9132204632186cdcdd6f638","isMergeCommit":true,"messageTitle":"Merge branch \u0027update-DG\u0027","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"zoebelle-pang":{"docs":4,"functional-code":0,"test-code":0},"AL-ZT":{"docs":95,"functional-code":0,"test-code":0,"other":1},"gowthaman-01":{"docs":0,"functional-code":0,"test-code":0},"Hwww23":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"zoebelle-pang":3.3580246,"AL-ZT":414.94128,"gowthaman-01":0.0,"Hwww23":60.654316},"authorDisplayNameMap":{"zoebelle-pang":"CS2103-F15-2 ZOEB..PANG","AL-ZT":"CS2103-F15-2 LIM ..TING","gowthaman-01":"CS2103-F15-2 GOWT..NDAN","Hwww23":"CS2103-F15-2 TANG.. WEN"}} +{"authorDailyContributionsMap":{"zoebelle-pang":[{"date":"2024-03-11","commitResults":[{"hash":"f2e419db23e7c13f045fbd6c55e542b8b3537afd","isMergeCommit":false,"messageTitle":"Add profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]}],"AL-ZT":[{"date":"2024-03-01","commitResults":[{"hash":"7347d212c9ef64d45b634a572023b2f4b9b69957","isMergeCommit":false,"messageTitle":"Update Zheng Ting\u0027s Profile in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"478b5a4c32f1eabcd8ae66e94052a05ab16b43b7","isMergeCommit":false,"messageTitle":"Update payment functionality in User Guide.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":0}}},{"hash":"cbf7b777d4734872b6632cd7fbff7c4f7559686c","isMergeCommit":false,"messageTitle":"Hyperlink fix for mark_payment","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f59c8d682dc362972628c092d047a0a1f96dc152","isMergeCommit":false,"messageTitle":"Change site-wide settings for TutorsGo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"1e5de123d9a1c79a1c3cf06ca3946ac17620d928","isMergeCommit":false,"messageTitle":"Minor Fix","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}}]},{"date":"2024-03-04","commitResults":[{"hash":"27dd34d30c683b78ad5c64ff1529dad2dbcba7ce","isMergeCommit":false,"messageTitle":"Syntax fix","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"44518a82d7fbb2bfbebceb235d19e60066738024","isMergeCommit":false,"messageTitle":"Minor fix to sentences","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"00b5d32183f8d086e0c6084ee53a5e61b0441c21","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Updates to target user profile, value proposition and user stories appended in Developer Guide.\n","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":14}}}]},{"date":"2024-03-11","commitResults":[{"hash":"0ae6b7fbfb1b76fe402587a15c481538c538b3b0","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Hwww23/add-profile","messageBody":"Update Haowen\u0027s profile in AboutUs","fileTypesAndContributionMap":{}},{"hash":"30af7ee0958b22442241f5e38b04848cf29fb043","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Hwww23/update-readme","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"74c813365b6d07e4c5eb31e150ac6ad391f6abe2","isMergeCommit":true,"messageTitle":"Merge pull request #35 from Hwww23/update-readme","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"2d70afde07269769bd7200a0e59b02a68ea1e074","isMergeCommit":false,"messageTitle":"Update use cases in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":10}}},{"hash":"b3310ad52d418b11f9e0a1ca28964874de339934","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-developer-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5cd57b5838abb37f57da16d74cbab3a52f881bc1","isMergeCommit":true,"messageTitle":"Merge pull request #36 from zoebelle-pang/profilepic","messageBody":"Add profile picture","fileTypesAndContributionMap":{}},{"hash":"89a9ee3cdaa9ebedfcb9eb83fec0c9a4b4208ad4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-developer-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a641bc7f842182955989615d79a44a2a509916fa","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Hwww23/update-DG","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"2f0bae8233fbf18c34d1e65f6d38d4ea2e0abec9","isMergeCommit":true,"messageTitle":"Merge pull request #39 from Hwww23/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"2b36e26ad2a6f295f8ced4a65fc0d84093894e00","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into add-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0d1d65f90d19ab17086ad66b68caf1f39d94b590","isMergeCommit":false,"messageTitle":"Fix AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"7507d5d6901333358f1df4b2da788174388fc283","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103-F15-2/tp into add-user-guide","messageBody":"","fileTypesAndContributionMap":{}}]}],"gowthaman-01":[],"Hwww23":[{"date":"2024-03-11","commitResults":[{"hash":"0c272ad964199eca19d0a3ed63dd7c0c911abe89","isMergeCommit":false,"messageTitle":"Update AboutUs.md and Add hwww23.png","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"955fe0b025234d8f8ce0159708b11bc8ab9e78d4","isMergeCommit":true,"messageTitle":"Merge pull request #6 from AL-ZT/add-alzt-info","messageBody":"Update Zheng Ting\u0027s Profile in AboutUs","fileTypesAndContributionMap":{}},{"hash":"dce25f1c6e85ebe43877abc2521177ee561ebf50","isMergeCommit":true,"messageTitle":"Merge pull request #8 from AL-ZT/add-user-guide","messageBody":"Update payment functionality in User Guide","fileTypesAndContributionMap":{}},{"hash":"91c5d7158dfc5c1c9462c9cfec763df591f8ec2c","isMergeCommit":true,"messageTitle":"Merge pull request #10 from AL-ZT/change-site-wide-settings","messageBody":"Changes to site-wide settings","fileTypesAndContributionMap":{}},{"hash":"116481e582a424cb2a72493fa227d7f080735059","isMergeCommit":true,"messageTitle":"Merge pull request #15 from AL-ZT/update-developer-guide","messageBody":"Update target user profile, value proposition and user stories in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"6daad9b7f85ead216395af6153230dd0b48df965","isMergeCommit":false,"messageTitle":"Update READEME.md and Ui.png","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":7}}},{"hash":"baa1f350e88756c9a1af04ef3663d42aaf509e87","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Minor changes to remove presence of ab3\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c95b3b7c2eb3fc923855648fb0e01c0f65eaa6ec","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Add more NFRs\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":0}}},{"hash":"384cf3844e30942d520cb0717dbd658a28556910","isMergeCommit":true,"messageTitle":"Merge pull request #37 from AL-ZT/update-developer-guide","messageBody":"Update use cases in DG","fileTypesAndContributionMap":{}},{"hash":"850fa4feb098107627e66f9cbda36ce2166315f5","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Update glossary\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}},{"hash":"db7a5245ec28ad8df9132204632186cdcdd6f638","isMergeCommit":true,"messageTitle":"Merge branch \u0027update-DG\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"09b0f1872e2ffeb9055b419bbd25aed1189425b2","isMergeCommit":true,"messageTitle":"Merge pull request #41 from AL-ZT/add-user-guide","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"zoebelle-pang":{"docs":2,"functional-code":0,"test-code":0},"AL-ZT":{"docs":99,"functional-code":0,"test-code":0,"other":1},"gowthaman-01":{"docs":0,"functional-code":0,"test-code":0},"Hwww23":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"zoebelle-pang":3.3580246,"AL-ZT":454.69446,"gowthaman-01":0.0,"Hwww23":60.654316},"authorDisplayNameMap":{"zoebelle-pang":"CS2103-F15-2 ZOEB..PANG","AL-ZT":"CS2103-F15-2 LIM ..TING","gowthaman-01":"CS2103-F15-2 GOWT..NDAN","Hwww23":"CS2103-F15-2 TANG.. WEN"}} diff --git a/AY2324S2-CS2103T-F12-1_tp_master/authorship.json b/AY2324S2-CS2103T-F12-1_tp_master/authorship.json index c91e5b59..53b392dd 100644 --- a/AY2324S2-CS2103T-F12-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F12-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"tanjieling0"},"content":"# NetConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tanjieling0"},"content":"## Introduction","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"tanjieling0"},"content":"NetConnect is a desktop app for managing contacts in SMEs, optimized for use via a Command Line Interface (CLI) while still ","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"tanjieling0"},"content":"having the benefits of a Graphical User Interface (GUI). It enables managers to efficiently manage their employees,","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tanjieling0"},"content":"clients, as well as suppliers, **all in one place** ☝🏻.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"tanjieling0"},"content":"## Features","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"tanjieling0"},"content":"1. Profile Management","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"tanjieling0"},"content":" * Add a new profile: Easily create a new profile for an employee, client, or supplier. You can choose to tag them with a custom tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"tanjieling0"},"content":" * Delete or Edit a profile: Remove a profile from the list or Edit their information via their ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"tanjieling0"},"content":"2. Category Management","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"tanjieling0"},"content":" * Roles: Categorize your profiles into *Employees, Clients, or Suppliers*.","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"tanjieling0"},"content":"3. Search","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"tanjieling0"},"content":" * Search by name: Find a profile by their name.","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"tanjieling0"},"content":" * Search by contact: Find a profile by their contact number.","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"tanjieling0"},"content":"## User-Friendly Commands","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"tanjieling0"},"content":"NetConnect uses simple CLI commands to make it easy for you to manage your contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"tanjieling0"},"content":"## Error Handling","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"tanjieling0"},"content":"With a robust error handling system, clear error and resolution messages will guide you through the process of ","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"tanjieling0"},"content":"managing your contacts seamlessly.","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"tanjieling0"},"content":"## Getting Started","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"tanjieling0"},"content":"To begin your journey with NetConnect, simply download the latest release from [here]() and refer to the [User Guide](docs/UserGuide.md)","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"tanjieling0"},"content":"for detailed guidance in using the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"tanjieling0"},"content":"For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tanjieling0":30,"-":5}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"nuyer"},"content":"### Puri Virakarin","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/purivirakarin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"nuyer"},"content":"[[github](https://github.com/purivirakarin)]","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/purivirakarin.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"nuyer"},"content":"* Role: Developer ","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"nuyer"},"content":"### Rungrawin Chowiwattana","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/nuyer.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/nuyer)]","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/nuyer.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"nuyer"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"nuyer"},"content":"### Sia Zhong Qing","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/starsia.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/starsia)]","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/starsia.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"nuyer"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"nuyer"},"content":"### Shaun Lee Xuan Wei","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/shaunlxw.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/shaunlxw)]","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/shaunlxw.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"nuyer"},"content":"### Tan Jie Ling","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/tanjieling0.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/tanjieling0)]","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/tanjieling0.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"nuyer":27,"-":35}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"purivirakarin"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eNetConnect\u003c/a\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"purivirakarin":1,"-":66}},{"path":"docs/team/nuyer.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"nuyer\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/purivirakarin.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"purivirakarin\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/shaunlxw.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"shaunlxw\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/starsia.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"starsia\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/tanjieling0.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"tanjieling0\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"tanjieling0"},"content":"# NetConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tanjieling0"},"content":"## Introduction","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"tanjieling0"},"content":"NetConnect is a desktop app for managing contacts in SMEs, optimized for use via a Command Line Interface (CLI) while still ","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"tanjieling0"},"content":"having the benefits of a Graphical User Interface (GUI). It enables managers to efficiently manage their employees,","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tanjieling0"},"content":"clients, as well as suppliers, **all in one place** ☝🏻.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"tanjieling0"},"content":"## Features","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"tanjieling0"},"content":"1. Profile Management","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"tanjieling0"},"content":" * Add a new profile: Easily create a new profile for an employee, client, or supplier. You can choose to tag them with a custom tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"tanjieling0"},"content":" * Delete or Edit a profile: Remove a profile from the list or Edit their information via their ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"tanjieling0"},"content":"2. Category Management","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"tanjieling0"},"content":" * Roles: Categorize your profiles into *Employees, Clients, or Suppliers*.","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"tanjieling0"},"content":"3. Search","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"tanjieling0"},"content":" * Search by name: Find a profile by their name.","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"tanjieling0"},"content":" * Search by contact: Find a profile by their contact number.","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"tanjieling0"},"content":"## User-Friendly Commands","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"tanjieling0"},"content":"NetConnect uses simple CLI commands to make it easy for you to manage your contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"tanjieling0"},"content":"## Error Handling","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"tanjieling0"},"content":"With a robust error handling system, clear error and resolution messages will guide you through the process of ","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"tanjieling0"},"content":"managing your contacts seamlessly.","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"tanjieling0"},"content":"## Getting Started","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"tanjieling0"},"content":"To begin your journey with NetConnect, simply download the latest release from [here]() and refer to the [User Guide](docs/UserGuide.md)","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"tanjieling0"},"content":"for detailed guidance in using the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"tanjieling0"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"tanjieling0"},"content":"For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tanjieling0":30,"-":5}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"nuyer"},"content":"### Puri Virakarin","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/purivirakarin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"nuyer"},"content":"[[github](https://github.com/purivirakarin)]","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/purivirakarin.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"nuyer"},"content":"* Role: Developer ","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"nuyer"},"content":"### Rungrawin Chowiwattana","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/nuyer.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/nuyer)]","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/nuyer.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"nuyer"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"nuyer"},"content":"### Sia Zhong Qing","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/starsia.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/starsia)]","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/starsia.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"nuyer"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"nuyer"},"content":"### Shaun Lee Xuan Wei","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/shaunlxw.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/shaunlxw)]","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/shaunlxw.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"nuyer"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"nuyer"},"content":"### Tan Jie Ling","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"nuyer"},"content":"\u003cimg src\u003d\"images/tanjieling0.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"nuyer"},"content":"[[github](http://github.com/tanjieling0)]","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"nuyer"},"content":"[[portfolio](team/tanjieling0.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"nuyer":27,"-":35}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"starsia"},"content":"Experienced managers who:","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"starsia"},"content":"* oversees contact relations with suppliers, customers and employees","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"starsia"},"content":"* has to manage a significant number of contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"starsia"},"content":"* works independently in a supervisory role","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"starsia"},"content":"* has average IT skills","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":285,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"starsia"},"content":"**Value proposition**: provides managers a platform to manage employee, client and partner contact information","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"starsia"},"content":"easily, and to keep track of past interactions.","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":346,"author":{"gitId":"shaunlxw"},"content":"* **Persons**: Any person in the contact list. Includes all employees, clients and partners.","lastModifiedDate":"2024-03-11"},{"lineNumber":347,"author":{"gitId":"shaunlxw"},"content":"* **State**: The page that displays the results from the last command given.","lastModifiedDate":"2024-03-11"},{"lineNumber":348,"author":{"gitId":"shaunlxw"},"content":"* **UID**: A unique numerical identifier for any person added in NetConnect.","lastModifiedDate":"2024-03-11"},{"lineNumber":349,"author":{"gitId":"shaunlxw"},"content":"* **CSV file**: A plain text file format that uses commas to separate values, and newlines to separate records.","lastModifiedDate":"2024-03-11"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":359,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":360,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"starsia":7,"-":393,"shaunlxw":4}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"purivirakarin"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eNetConnect\u003c/a\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"shaunlxw"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-F12-1/tp/\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"purivirakarin":1,"-":65,"shaunlxw":1}},{"path":"docs/team/nuyer.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"nuyer\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/purivirakarin.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"purivirakarin\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/shaunlxw.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"shaunlxw\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/starsia.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"starsia\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}},{"path":"docs/team/tanjieling0.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"nuyer"},"content":" layout: page","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"nuyer"},"content":" title: \"tanjieling0\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"nuyer"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"nuyer"},"content":"### Project: NetConnect","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"nuyer"},"content":"NetConnect - ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"nuyer"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"nuyer"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"nuyer"},"content":"_{to be added}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"nuyer":12}}] diff --git a/AY2324S2-CS2103T-F12-1_tp_master/commits.json b/AY2324S2-CS2103T-F12-1_tp_master/commits.json index 5f067b07..0fd29106 100644 --- a/AY2324S2-CS2103T-F12-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-F12-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"tanjieling0":[{"date":"2024-03-07","commitResults":[{"hash":"1e1c501ffdf662bed5e911bcc23e00df2aa56290","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":10}}},{"hash":"5e1d32f8256bfc5de8529baa098578016ff2cb44","isMergeCommit":false,"messageTitle":"Include relevant text from original README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-08","commitResults":[{"hash":"95c571bb7f9f4063553d40989bffb60cd68ef8fe","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Co-authored-by: Zhong Qing \u003c104408800+starsia@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d342c0c80149ee42995659d20716d763de27b149","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Co-authored-by: Zhong Qing \u003c104408800+starsia@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"starsia":[{"date":"2024-03-11","commitResults":[{"hash":"a73907fb72b501c8523a6b107abcfad0d0804a49","isMergeCommit":true,"messageTitle":"Merge pull request #11 from tanjieling0/Readme","messageBody":"Update README","fileTypesAndContributionMap":{}}]}],"nuyer":[{"date":"2024-03-08","commitResults":[{"hash":"44564446409863a9b7ef310acc3e53c60b63263d","isMergeCommit":false,"messageTitle":"Improve About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":87,"deletions":26}}}]}],"purivirakarin":[{"date":"2024-03-06","commitResults":[{"hash":"440cddfa80a2391f6d6ca74ee90150d68e320c56","isMergeCommit":false,"messageTitle":"Edit MyProduct to NetConnect in docs/","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-11","commitResults":[{"hash":"db3a7d5be9b24d7d601b59fc317fa47cbc6d97a9","isMergeCommit":true,"messageTitle":"Merge pull request #19 from nuyer/about-us","messageBody":"Update About Us page","fileTypesAndContributionMap":{}}]}],"shaunlxw":[]},"authorFileTypeContributionMap":{"tanjieling0":{"docs":30,"functional-code":0,"test-code":0},"starsia":{"docs":0,"functional-code":0,"test-code":0},"nuyer":{"docs":87,"functional-code":0,"test-code":0},"purivirakarin":{"docs":1,"functional-code":0,"test-code":0},"shaunlxw":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tanjieling0":88.02778,"starsia":0.0,"nuyer":669.97833,"purivirakarin":0.20987657,"shaunlxw":0.0},"authorDisplayNameMap":{"tanjieling0":"CS2103T-F12-1 TAN ..LING","starsia":"CS2103T-F12-1 SIA ..QING","nuyer":"CS2103T-F12-1 CHOW..AWIN","purivirakarin":"CS2103T-F12-1 VIRA..PURI","shaunlxw":"CS2103T-F12-1 SHAU.. WEI"}} +{"authorDailyContributionsMap":{"tanjieling0":[{"date":"2024-03-07","commitResults":[{"hash":"1e1c501ffdf662bed5e911bcc23e00df2aa56290","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":10}}},{"hash":"5e1d32f8256bfc5de8529baa098578016ff2cb44","isMergeCommit":false,"messageTitle":"Include relevant text from original README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-08","commitResults":[{"hash":"95c571bb7f9f4063553d40989bffb60cd68ef8fe","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Co-authored-by: Zhong Qing \u003c104408800+starsia@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d342c0c80149ee42995659d20716d763de27b149","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Co-authored-by: Zhong Qing \u003c104408800+starsia@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"starsia":[{"date":"2024-03-07","commitResults":[{"hash":"c3fe1222b1648d7078446e4344182cfee3a48c52","isMergeCommit":false,"messageTitle":"Update Target User Profile and Value Proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":2}}}]},{"date":"2024-03-11","commitResults":[{"hash":"a73907fb72b501c8523a6b107abcfad0d0804a49","isMergeCommit":true,"messageTitle":"Merge pull request #11 from tanjieling0/Readme","messageBody":"Update README","fileTypesAndContributionMap":{}}]},{"date":"2024-03-12","commitResults":[{"hash":"74b9382ec601ac92957661a8b7777be6bcd6fd9a","isMergeCommit":true,"messageTitle":"Merge pull request #27 from shaunlxw/dg/glossary","messageBody":"Developer Guide: Update glossary","fileTypesAndContributionMap":{}}]}],"nuyer":[{"date":"2024-03-08","commitResults":[{"hash":"44564446409863a9b7ef310acc3e53c60b63263d","isMergeCommit":false,"messageTitle":"Improve About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":87,"deletions":26}}}]}],"purivirakarin":[{"date":"2024-03-06","commitResults":[{"hash":"440cddfa80a2391f6d6ca74ee90150d68e320c56","isMergeCommit":false,"messageTitle":"Edit MyProduct to NetConnect in docs/","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-11","commitResults":[{"hash":"db3a7d5be9b24d7d601b59fc317fa47cbc6d97a9","isMergeCommit":true,"messageTitle":"Merge pull request #19 from nuyer/about-us","messageBody":"Update About Us page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-12","commitResults":[{"hash":"d6afd7aeb656bb97d8492ec5bcd43b71af8d67c3","isMergeCommit":true,"messageTitle":"Merge pull request #15 from starsia/Update-Target-User-Profile,-Value-Proposition","messageBody":"Update Target User Profile and Value Proposition","fileTypesAndContributionMap":{}},{"hash":"656a3b99e5b1d436a372641da146fe5da800f53f","isMergeCommit":true,"messageTitle":"Merge pull request #28 from shaunlxw/markbind-config","messageBody":"Markbind default.md: Change ref attribute of github link","fileTypesAndContributionMap":{}}]}],"shaunlxw":[{"date":"2024-03-11","commitResults":[{"hash":"4cd943a2a7f2cbf788d5b3582f6b9169e71578ea","isMergeCommit":false,"messageTitle":"Developer Guide: Update glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}}]},{"date":"2024-03-12","commitResults":[{"hash":"69a30cddb9d5e85f2b850b8d45dc617859002a47","isMergeCommit":false,"messageTitle":"Markbind default.md: Change ref attribute of github link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"tanjieling0":{"docs":30,"functional-code":0,"test-code":0},"starsia":{"docs":7,"functional-code":0,"test-code":0},"nuyer":{"docs":87,"functional-code":0,"test-code":0},"purivirakarin":{"docs":1,"functional-code":0,"test-code":0},"shaunlxw":{"docs":5,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tanjieling0":83.70637,"starsia":4.038782,"nuyer":636.6814,"purivirakarin":0.19944598,"shaunlxw":1.3905817},"authorDisplayNameMap":{"tanjieling0":"CS2103T-F12-1 TAN ..LING","starsia":"CS2103T-F12-1 SIA ..QING","nuyer":"CS2103T-F12-1 CHOW..AWIN","purivirakarin":"CS2103T-F12-1 VIRA..PURI","shaunlxw":"CS2103T-F12-1 SHAU.. WEI"}} diff --git a/AY2324S2-CS2103T-F12-3_tp_master/authorship.json b/AY2324S2-CS2103T-F12-3_tp_master/authorship.json index d0b2ef2e..22dd67c8 100644 --- a/AY2324S2-CS2103T-F12-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F12-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"agreatdayy"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"[![codecov badge](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)","lastModifiedDate":"2024-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-23"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"![MockUi](docs/images/mockUI.png)","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"* This is **a CS2103T project by NUS Computing students**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"* The project simulates an ongoing software project for a desktop application (called _TutorPro_) used by private tutors for managing their students. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"* It is named `TutorPro Level 1` (`TP-1` for short) because it was initially created as a part of a series of `TutorPro` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"* For the detailed documentation of this project, see the **[tutorpro.github.io](https://ay2324s2-cs2103t-f12-3.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"agreatdayy"},"content":"* This project is based on the AddressBook-Level3 project created by the **[SE-EDU initiative](https://se-education.org)**. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"agreatdayy":8,"-":8}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"tamagochuuu"},"content":"You can reach us at the email `[insert email]`","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"### Carsten Joe Ng","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"\u003cimg src\u003d\"images/carsten.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"[[github](http://github.com/wyrkx)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"[[portfolio](team/carsten.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"TarinPairor"},"content":"- Role: Team Lead","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"TarinPairor"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"TarinPairor"},"content":"### Pairor Tarin","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"TarinPairor"},"content":"\u003cimg src\u003d\"images/TarinPairorProfile.png\" width\u003d\"199px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"TarinPairor"},"content":"[[github](http://github.com/TarinPairor)]","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"agreatdayy"},"content":"### Lee Xin Yuan","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"agreatdayy"},"content":"\u003cimg src\u003d\"images/xinyuan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"agreatdayy"},"content":"[[github](http://github.com/agreatdayy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"agreatdayy"},"content":"[[portfolio](team/xinyuan.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"TarinPairor"},"content":"- Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"TarinPairor"},"content":"- Responsibilities: Dev Ops","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"tamagochuuu"},"content":"### Tee Chu Jie","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"tamagochuuu"},"content":"\u003cimg src\u003d\"images/chujie.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"tamagochuuu"},"content":"[[github](https://github.com/tamagochuuu)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"tamagochuuu"},"content":"[[portfolio](team/chujie.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"tamagochuuu"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"tamagochuuu"},"content":"- Responsibilites: Dev Ops","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"agreatdayy":4,"Wyrkx":4,"TarinPairor":7,"-":25,"tamagochuuu":7}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who prefer CLI over GUI","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who go to tutees\u0027 houses and teach one-to-one","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who teach multiple subjects","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who teach multiple levels or a specific level, e.g. primary school students","lastModifiedDate":"2024-03-07"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"tamagochuuu"},"content":"**Value proposition**: Allows for easy track and management of tutees, e.g. grades, addresses, deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"tamagochuuu"},"content":"|----------|---------------|---------------------------------------------------------|----------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | track my tutee\u0027s grades, addresses and deadlines easily | efficiently manage my tutoring sessions |","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | input new tutees\u0027 progress seamlessly | add new tutees\u0027 information |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | delete previously created inputs | remove information that I no longer need |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | track my project tasks and timelines seamlessly | effectively manage my workflow and deliver on time |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"tamagochuuu"},"content":"| `* *` | private tutor | set reminders for important deadlines and milestones | never miss a crucial event |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"tamagochuuu"},"content":"(For all use cases below, the **System** is `TutorPro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to add a specific student","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro adds the student","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The student has the same details as someone already in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to list students","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro shows a list of students","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"tamagochuuu"},"content":"3. User requests to delete a specific student in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"tamagochuuu"},"content":"4. TutorPro deletes the student","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"tamagochuuu"},"content":" * 3a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"tamagochuuu"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"tamagochuuu"},"content":"* 3b. The given student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"tamagochuuu"},"content":" * 3b1. TutorPro displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Find a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to find a specific student.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro displays a list of students whose details match the user input.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Update a student\u0027s progress/particulars**","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to update a specific student’s progress/particulars.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro updates the student’s progress/particulars.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays the updated information to the user for verification.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"tamagochuuu"},"content":"* 2b. The given category is not one of the available categories.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"tamagochuuu"},"content":" * 2b1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"tamagochuuu"},"content":"* 2c. Given new information to update does not match the input format for the particular category.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"tamagochuuu"},"content":" * 2c1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Setting a reminder**","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to set a reminder.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro sets the reminder.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays a list of currently scheduled reminders.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The given date or time is in an incorrect format.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Create a tag**","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to create a tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro creates the specified tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays a list of created tags.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified tag to create already exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Tag a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to tag a student.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro tags the student.","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays the list of students who have the same tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"tamagochuuu"},"content":"* 2b. The specified tag does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"tamagochuuu"},"content":" * 2b1. TutorPro displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Display the user\u0027s schedule**","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to display their current schedule.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro displays the user’s current schedule","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The user has nothing in their schedule.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Set a recurring event**","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to set an event that recurs weekly.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro sets the event.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays the list of the user’s weekly recurring events.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"tamagochuuu"},"content":"* 2a. Given day(s) is/are in the wrong input format.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"tamagochuuu"},"content":"* 2b. Given student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"tamagochuuu"},"content":" * 2b1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"tamagochuuu"},"content":"1. Security:","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"tamagochuuu"},"content":"* The application must ensure secure storage and transmission of sensitive student data, such as grades and contact information, adhering to industry-standard _encryption_ protocols.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"tamagochuuu"},"content":"* Access to student records must be restricted to authorized users only, with role-based access control mechanisms in place.","lastModifiedDate":"2024-03-07"},{"lineNumber":481,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":482,"author":{"gitId":"tamagochuuu"},"content":"2. Privacy:","lastModifiedDate":"2024-03-07"},{"lineNumber":483,"author":{"gitId":"tamagochuuu"},"content":"* The application should comply with relevant privacy regulations (e.g., GDPR, HIPAA) to safeguard students\u0027 personal information.","lastModifiedDate":"2024-03-07"},{"lineNumber":484,"author":{"gitId":"tamagochuuu"},"content":"* Student data should only be accessible to the student, their assigned tutor, and authorized administrative staff.","lastModifiedDate":"2024-03-07"},{"lineNumber":485,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":486,"author":{"gitId":"tamagochuuu"},"content":"3. Scalability:","lastModifiedDate":"2024-03-07"},{"lineNumber":487,"author":{"gitId":"tamagochuuu"},"content":"* The system must be able to handle a growing number of students and tutors without a significant decrease in performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"tamagochuuu"},"content":"* It should support concurrent access by multiple users without degradation in response time or system stability.","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":490,"author":{"gitId":"tamagochuuu"},"content":"4. Reliability:","lastModifiedDate":"2024-03-07"},{"lineNumber":491,"author":{"gitId":"tamagochuuu"},"content":"* The application should have minimal downtime and be available for use during critical academic periods, such as exam periods or assignment deadlines.","lastModifiedDate":"2024-03-07"},{"lineNumber":492,"author":{"gitId":"tamagochuuu"},"content":"* It should have mechanisms in place to recover from failures gracefully, ensuring _data integrity_ and continuity of service.","lastModifiedDate":"2024-03-07"},{"lineNumber":493,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":494,"author":{"gitId":"tamagochuuu"},"content":"5. Interoperability:","lastModifiedDate":"2024-03-07"},{"lineNumber":495,"author":{"gitId":"tamagochuuu"},"content":"* The application should be compatible with various devices and _operating systems_ commonly used by both tutors and students, such as laptops, tablets, and smartphones.","lastModifiedDate":"2024-03-07"},{"lineNumber":496,"author":{"gitId":"tamagochuuu"},"content":"* It should support integration with other academic systems or tools, such as learning management systems or scheduling software.","lastModifiedDate":"2024-03-07"},{"lineNumber":497,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":498,"author":{"gitId":"tamagochuuu"},"content":"6. Usability:","lastModifiedDate":"2024-03-07"},{"lineNumber":499,"author":{"gitId":"tamagochuuu"},"content":"* The application interface should be intuitive and user-friendly, requiring minimal training for tutors and students to navigate and use effectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":500,"author":{"gitId":"tamagochuuu"},"content":"* It should provide clear instructions and guidance for inputting and accessing academic information and contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":501,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":502,"author":{"gitId":"tamagochuuu"},"content":"7. Performance:","lastModifiedDate":"2024-03-07"},{"lineNumber":503,"author":{"gitId":"tamagochuuu"},"content":"* The system should respond promptly to user actions, such as loading student profiles, updating grades, or scheduling tutoring sessions, aiming for sub-second response times.","lastModifiedDate":"2024-03-07"},{"lineNumber":504,"author":{"gitId":"tamagochuuu"},"content":"* It should efficiently manage database queries and data retrieval to prevent delays in accessing information.","lastModifiedDate":"2024-03-07"},{"lineNumber":505,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":506,"author":{"gitId":"tamagochuuu"},"content":"8. Maintainability:","lastModifiedDate":"2024-03-07"},{"lineNumber":507,"author":{"gitId":"tamagochuuu"},"content":"* The application codebase should be well-documented and _modular_, facilitating ease of maintenance and future enhancements.","lastModifiedDate":"2024-03-07"},{"lineNumber":508,"author":{"gitId":"tamagochuuu"},"content":"* It should support version control and have mechanisms for bug tracking and resolution.","lastModifiedDate":"2024-03-07"},{"lineNumber":509,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":510,"author":{"gitId":"tamagochuuu"},"content":"9. Accessibility:","lastModifiedDate":"2024-03-07"},{"lineNumber":511,"author":{"gitId":"tamagochuuu"},"content":"* The application interface should be accessible to users with disabilities, following web accessibility guidelines such as WCAG.","lastModifiedDate":"2024-03-07"},{"lineNumber":512,"author":{"gitId":"tamagochuuu"},"content":"* It should support alternative input methods, screen readers, and keyboard navigation for users with visual or motor impairments.","lastModifiedDate":"2024-03-07"},{"lineNumber":513,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":514,"author":{"gitId":"tamagochuuu"},"content":"10. Backup and Disaster Recovery:","lastModifiedDate":"2024-03-07"},{"lineNumber":515,"author":{"gitId":"tamagochuuu"},"content":"* Regular backups of student data should be performed, with procedures in place for data restoration in case of accidental deletion or system failure.","lastModifiedDate":"2024-03-07"},{"lineNumber":516,"author":{"gitId":"tamagochuuu"},"content":"* The application should have disaster recovery measures to ensure minimal data loss and service disruption in the event of server or infrastructure failures.","lastModifiedDate":"2024-03-07"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"tamagochuuu"},"content":"* **Encryption** - The process of converting information or data into a code, especially to prevent unauthorized access.","lastModifiedDate":"2024-03-07"},{"lineNumber":522,"author":{"gitId":"tamagochuuu"},"content":"* **Data integrity** - The accuracy, completeness, and quality of data as it’s maintained over time and across formats.","lastModifiedDate":"2024-03-07"},{"lineNumber":523,"author":{"gitId":"tamagochuuu"},"content":"* **Operating system** - Mainstream operating systems are: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-07"},{"lineNumber":524,"author":{"gitId":"tamagochuuu"},"content":"* **Modular** - By modularizing a codebase you will define more clear boundaries between different clusters of objects that make up a screen of feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":357,"tamagochuuu":220}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"title: TutorPro Level-1","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"![mockUi](images/mockUI.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"**TutorPro is a desktop application for managing your students\u0027 details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":"* If you are interested in using TutorPro, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"* If you are interested about developing TutorPro, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"agreatdayy"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"agreatdayy":7,"-":13}},{"path":"docs/team/carsten.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"title: Carsten\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"### Project: TutorPro Level 1","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"TutorPro - Level 1 is a desktop contact management application used for managing students as a **Private Tutor**. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" * README:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Wyrkx":33}},{"path":"docs/team/chujie.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tamagochuuu"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"tamagochuuu"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"tamagochuuu"},"content":"title: Chu Jie\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tamagochuuu"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"tamagochuuu"},"content":"### Project: TutorPro Level 1","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"tamagochuuu"},"content":"TutorPro - Level 1 is a desktop contact management application used for managing students as a **Private Tutor**. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"tamagochuuu"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"tamagochuuu"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"tamagochuuu"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"tamagochuuu"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"tamagochuuu"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"tamagochuuu"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"tamagochuuu"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"tamagochuuu"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"tamagochuuu"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"tamagochuuu"},"content":" * README:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"tamagochuuu"},"content":" * Updated our Developer Guide.","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"tamagochuuu"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"tamagochuuu"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"tamagochuuu"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"tamagochuuu"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"tamagochuuu"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tamagochuuu":33}},{"path":"docs/team/xinyuan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"agreatdayy"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"title: Xin Yuan\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"### Project: TutorPro Level 1","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"content":"TutorPro - Level 1 is a desktop contact management application used for managing students as a **Private Tutor**. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"agreatdayy"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"agreatdayy"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"agreatdayy"},"content":" * README:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"agreatdayy"},"content":" * Made UI mockup of our intended final product.","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"agreatdayy"},"content":" * Update all contents to match our project.","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"agreatdayy"},"content":" * Acknowledge the original source of the code.","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"agreatdayy"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"agreatdayy"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"agreatdayy"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"agreatdayy"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"agreatdayy"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"agreatdayy":31,"Wyrkx":3}},{"path":"src/main/java/tutorpro/AppParameters.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.FileUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Represents the parsed command-line parameters given to the application.","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class AppParameters {","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AppParameters.class);","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Path configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public Path getConfigPath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setConfigPath(Path configPath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.configPath \u003d configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Parses the application command-line parameters.","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static AppParameters parse(Application.Parameters parameters) {","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" Map\u003cString, String\u003e namedParameters \u003d parameters.getNamed();","lastModifiedDate":"2018-04-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" String configPathParameter \u003d namedParameters.get(\"config\");","lastModifiedDate":"2018-04-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (configPathParameter !\u003d null \u0026\u0026 !FileUtil.isValidPath(configPathParameter)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" logger.warning(\"Invalid config path \" + configPathParameter + \". Using default config path.\");","lastModifiedDate":"2018-04-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" configPathParameter \u003d null;","lastModifiedDate":"2018-04-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" appParameters.setConfigPath(configPathParameter !\u003d null ? Paths.get(configPathParameter) : null);","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return appParameters;","lastModifiedDate":"2018-04-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-04-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (!(other instanceof AppParameters)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" AppParameters otherAppParameters \u003d (AppParameters) other;","lastModifiedDate":"2018-04-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return Objects.equals(configPath, otherAppParameters.configPath);","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return configPath.hashCode();","lastModifiedDate":"2018-04-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .add(\"configPath\", configPath)","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-04-21"}],"authorContributionMap":{"Wyrkx":4,"-":69}},{"path":"src/main/java/tutorpro/Main.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2019-02-08"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2019-02-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * The main entry point to the application.","lastModifiedDate":"2019-02-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * This is a workaround for the following error when MainApp is made the","lastModifiedDate":"2019-02-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * entry point of the application:","lastModifiedDate":"2019-02-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Error: JavaFX runtime components are missing, and are required to run this application","lastModifiedDate":"2019-02-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The reason is that MainApp extends Application. In that case, the","lastModifiedDate":"2019-02-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * LauncherHelper will check for the javafx.graphics module to be present","lastModifiedDate":"2019-02-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * as a named module. We don\u0027t use JavaFX via the module system so it can\u0027t","lastModifiedDate":"2019-02-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * find the javafx.graphics module, and so the launch is aborted.","lastModifiedDate":"2019-02-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * By having a separate main class (Main) that doesn\u0027t extend Application","lastModifiedDate":"2019-02-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * to be the entry point of the application, we avoid this issue.","lastModifiedDate":"2019-02-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class Main {","lastModifiedDate":"2019-02-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static Logger logger \u003d LogsCenter.getLogger(Main.class);","lastModifiedDate":"2023-07-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static void main(String[] args) {","lastModifiedDate":"2019-02-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // As per https://github.com/openjdk/jfx/blob/master/doc-files/release-notes-16.md","lastModifiedDate":"2023-07-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // JavaFX 16 (or later) runtime logs a warning at startup if JavaFX classes are loaded from","lastModifiedDate":"2023-07-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // the classpath instead of a module.","lastModifiedDate":"2023-07-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // Our application does not use Java modules yet. Even if it did, modules are ignored when","lastModifiedDate":"2023-07-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // packed into a FAT Jar file (as we do), which means this warning will persist even then.","lastModifiedDate":"2023-07-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // The warning however, can be safely ignored. Thus, the following log informs","lastModifiedDate":"2023-07-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // the user (if looking at the log output) that the said warning appearing in the log","lastModifiedDate":"2023-07-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // can be ignored.","lastModifiedDate":"2023-07-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" if (!(args instanceof String[])) {","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" ;","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" logger.warning(\"The warning about Unsupported JavaFX configuration below can be ignored.\");","lastModifiedDate":"2023-07-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Application.launch(MainApp.class, args);","lastModifiedDate":"2019-02-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-08"}],"authorContributionMap":{"Wyrkx":5,"-":39}},{"path":"src/main/java/tutorpro/MainApp.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2016-08-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-26"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Config;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Version;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ConfigUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.LogicManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.util.SampleDataUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.AddressBookStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonAddressBookStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonUserPrefsStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.Storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.StorageManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.UserPrefsStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.ui.Ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.ui.UiManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Runs the application.","lastModifiedDate":"2019-02-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"public class MainApp extends Application {","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final Version VERSION \u003d new Version(0, 2, 2, true);","lastModifiedDate":"2023-08-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(MainApp.class);","lastModifiedDate":"2017-04-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" protected Ui ui;","lastModifiedDate":"2016-09-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" protected Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" protected Storage storage;","lastModifiedDate":"2016-09-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" protected Model model;","lastModifiedDate":"2016-09-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" protected Config config;","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void init() throws Exception {","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" logger.info(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d[ Initializing AddressBook ]\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\");","lastModifiedDate":"2016-09-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" super.init();","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d AppParameters.parse(getParameters());","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" config \u003d initConfig(appParameters.getConfigPath());","lastModifiedDate":"2018-04-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" initLogging(config);","lastModifiedDate":"2023-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" UserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(config.getUserPrefsFilePath());","lastModifiedDate":"2017-02-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d initPrefs(userPrefsStorage);","lastModifiedDate":"2018-12-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" AddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(userPrefs.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2017-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" model \u003d initModelManager(storage, userPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" ui \u003d new UiManager(logic);","lastModifiedDate":"2018-12-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Returns a {@code ModelManager} with the data from {@code storage}\u0027s address book and {@code userPrefs}. \u003cbr\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * The data from the sample address book will be used instead if {@code storage}\u0027s address book is not found,","lastModifiedDate":"2017-08-16"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * or an empty address book will be used instead if errors occur when reading {@code storage}\u0027s address book.","lastModifiedDate":"2017-08-16"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" logger.info(\"Using data file : \" + storage.getAddressBookFilePath());","lastModifiedDate":"2023-07-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e addressBookOptional;","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook initialData;","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" addressBookOptional \u003d storage.readAddressBook();","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" if (!addressBookOptional.isPresent()) {","lastModifiedDate":"2016-09-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" logger.info(\"Creating a new data file \" + storage.getAddressBookFilePath()","lastModifiedDate":"2023-05-15"},{"lineNumber":84,"author":{"gitId":"-"},"content":" + \" populated with a sample AddressBook.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" initialData \u003d addressBookOptional.orElseGet(SampleDataUtil::getSampleAddressBook);","lastModifiedDate":"2016-12-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" logger.warning(\"Data file at \" + storage.getAddressBookFilePath() + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" + \" Will be starting with an empty AddressBook.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" initialData \u003d new AddressBook();","lastModifiedDate":"2016-09-24"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return new ModelManager(initialData, userPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private void initLogging(Config config) {","lastModifiedDate":"2016-09-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":" LogsCenter.init(config);","lastModifiedDate":"2016-09-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * Returns a {@code Config} using the file at {@code configFilePath}. \u003cbr\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * The default file path {@code Config#DEFAULT_CONFIG_FILE} will be used instead","lastModifiedDate":"2017-08-16"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * if {@code configFilePath} is null.","lastModifiedDate":"2017-08-16"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":105,"author":{"gitId":"-"},"content":" protected Config initConfig(Path configFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Config initializedConfig;","lastModifiedDate":"2016-09-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Path configFilePathUsed;","lastModifiedDate":"2018-04-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" configFilePathUsed \u003d Config.DEFAULT_CONFIG_FILE;","lastModifiedDate":"2016-09-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (configFilePath !\u003d null) {","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" logger.info(\"Custom Config file specified \" + configFilePath);","lastModifiedDate":"2016-09-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" configFilePathUsed \u003d configFilePath;","lastModifiedDate":"2016-09-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" logger.info(\"Using config file : \" + configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Optional\u003cConfig\u003e configOptional \u003d ConfigUtil.readConfig(configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" if (!configOptional.isPresent()) {","lastModifiedDate":"2023-01-03"},{"lineNumber":121,"author":{"gitId":"-"},"content":" logger.info(\"Creating new config file \" + configFilePathUsed);","lastModifiedDate":"2023-05-15"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-01-03"},{"lineNumber":123,"author":{"gitId":"-"},"content":" initializedConfig \u003d configOptional.orElse(new Config());","lastModifiedDate":"2016-09-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" logger.warning(\"Config file at \" + configFilePathUsed + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":126,"author":{"gitId":"-"},"content":" + \" Using default config properties.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":127,"author":{"gitId":"-"},"content":" initializedConfig \u003d new Config();","lastModifiedDate":"2016-09-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":130,"author":{"gitId":"-"},"content":" //Update config file in case it was missing to begin with or there are new/unused fields","lastModifiedDate":"2016-09-24"},{"lineNumber":131,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(initializedConfig, configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":133,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":134,"author":{"gitId":"-"},"content":" logger.warning(\"Failed to save config file : \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return initializedConfig;","lastModifiedDate":"2016-09-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":140,"author":{"gitId":"-"},"content":" * Returns a {@code UserPrefs} using the file at {@code storage}\u0027s user prefs file path,","lastModifiedDate":"2017-08-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" * or a new {@code UserPrefs} with default configuration if errors occur when","lastModifiedDate":"2017-08-16"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * reading from the file.","lastModifiedDate":"2017-08-16"},{"lineNumber":143,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":144,"author":{"gitId":"-"},"content":" protected UserPrefs initPrefs(UserPrefsStorage storage) {","lastModifiedDate":"2017-02-25"},{"lineNumber":145,"author":{"gitId":"-"},"content":" Path prefsFilePath \u003d storage.getUserPrefsFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":" logger.info(\"Using preference file : \" + prefsFilePath);","lastModifiedDate":"2023-05-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":148,"author":{"gitId":"-"},"content":" UserPrefs initializedPrefs;","lastModifiedDate":"2016-09-24"},{"lineNumber":149,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":150,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e prefsOptional \u003d storage.readUserPrefs();","lastModifiedDate":"2016-09-25"},{"lineNumber":151,"author":{"gitId":"-"},"content":" if (!prefsOptional.isPresent()) {","lastModifiedDate":"2023-01-03"},{"lineNumber":152,"author":{"gitId":"-"},"content":" logger.info(\"Creating new preference file \" + prefsFilePath);","lastModifiedDate":"2023-05-15"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-01-03"},{"lineNumber":154,"author":{"gitId":"-"},"content":" initializedPrefs \u003d prefsOptional.orElse(new UserPrefs());","lastModifiedDate":"2016-09-24"},{"lineNumber":155,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":156,"author":{"gitId":"-"},"content":" logger.warning(\"Preference file at \" + prefsFilePath + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" + \" Using default preferences.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":" initializedPrefs \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" //Update prefs file in case it was missing to begin with or there are new/unused fields","lastModifiedDate":"2016-09-24"},{"lineNumber":162,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":163,"author":{"gitId":"-"},"content":" storage.saveUserPrefs(initializedPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":164,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":165,"author":{"gitId":"-"},"content":" logger.warning(\"Failed to save config file : \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":168,"author":{"gitId":"-"},"content":" return initializedPrefs;","lastModifiedDate":"2016-09-24"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":171,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public void start(Stage primaryStage) {","lastModifiedDate":"2016-08-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":" logger.info(\"Starting AddressBook \" + MainApp.VERSION);","lastModifiedDate":"2016-09-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" ui.start(primaryStage);","lastModifiedDate":"2016-09-25"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":177,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":178,"author":{"gitId":"-"},"content":" public void stop() {","lastModifiedDate":"2016-08-08"},{"lineNumber":179,"author":{"gitId":"-"},"content":" logger.info(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d [ Stopping Address Book ] \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\");","lastModifiedDate":"2016-09-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":181,"author":{"gitId":"-"},"content":" storage.saveUserPrefs(model.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":182,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":183,"author":{"gitId":"-"},"content":" logger.severe(\"Failed to save preferences \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":184,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":24,"-":162}},{"path":"src/main/java/tutorpro/commons/core/Config.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2016-09-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Config values used by the app","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Config {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final Path DEFAULT_CONFIG_FILE \u003d Paths.get(\"config.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" // Config values customizable through config file","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private Level logLevel \u003d Level.INFO;","lastModifiedDate":"2016-09-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private Path userPrefsFilePath \u003d Paths.get(\"preferences.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public Level getLogLevel() {","lastModifiedDate":"2016-09-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return logLevel;","lastModifiedDate":"2016-09-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void setLogLevel(Level logLevel) {","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.logLevel \u003d logLevel;","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return userPrefsFilePath;","lastModifiedDate":"2016-09-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefsFilePath(Path userPrefsFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.userPrefsFilePath \u003d userPrefsFilePath;","lastModifiedDate":"2016-09-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof Config)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Config otherConfig \u003d (Config) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return Objects.equals(logLevel, otherConfig.logLevel)","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(userPrefsFilePath, otherConfig.userPrefsFilePath);","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Objects.hash(logLevel, userPrefsFilePath);","lastModifiedDate":"2018-12-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .add(\"logLevel\", logLevel)","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .add(\"userPrefsFilePath\", userPrefsFilePath)","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":64}},{"path":"src/main/java/tutorpro/commons/core/GuiSettings.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.awt.Point;","lastModifiedDate":"2017-01-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.Serializable;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * A Serializable class that contains the GUI settings.","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Guarantees: immutable.","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class GuiSettings implements Serializable {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final double DEFAULT_HEIGHT \u003d 600;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final double DEFAULT_WIDTH \u003d 740;","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final double windowWidth;","lastModifiedDate":"2018-11-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private final double windowHeight;","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Point windowCoordinates;","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code GuiSettings} with the default height, width and position.","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public GuiSettings() {","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" windowWidth \u003d DEFAULT_WIDTH;","lastModifiedDate":"2018-08-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" windowHeight \u003d DEFAULT_HEIGHT;","lastModifiedDate":"2018-08-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" windowCoordinates \u003d null; // null represent no coordinates","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Constructs a {@code GuiSettings} with the specified height, width and position.","lastModifiedDate":"2020-05-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public GuiSettings(double windowWidth, double windowHeight, int xPosition, int yPosition) {","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.windowWidth \u003d windowWidth;","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.windowHeight \u003d windowHeight;","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" windowCoordinates \u003d new Point(xPosition, yPosition);","lastModifiedDate":"2018-08-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public double getWindowWidth() {","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" return windowWidth;","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public double getWindowHeight() {","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return windowHeight;","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public Point getWindowCoordinates() {","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return windowCoordinates !\u003d null ? new Point(windowCoordinates) : null;","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (!(other instanceof GuiSettings)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" GuiSettings otherGuiSettings \u003d (GuiSettings) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return windowWidth \u003d\u003d otherGuiSettings.windowWidth","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u0026\u0026 windowHeight \u003d\u003d otherGuiSettings.windowHeight","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(windowCoordinates, otherGuiSettings.windowCoordinates);","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return Objects.hash(windowWidth, windowHeight, windowCoordinates);","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .add(\"windowWidth\", windowWidth)","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .add(\"windowHeight\", windowHeight)","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .add(\"windowCoordinates\", windowCoordinates)","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":80}},{"path":"src/main/java/tutorpro/commons/core/LogsCenter.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2023-05-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-05-20"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.ConsoleHandler;","lastModifiedDate":"2017-01-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.FileHandler;","lastModifiedDate":"2017-01-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.SimpleFormatter;","lastModifiedDate":"2017-01-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Configures and manages loggers and handlers, including their logging level","lastModifiedDate":"2016-09-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Named {@link Logger}s can be obtained from this class\u003cbr\u003e","lastModifiedDate":"2016-09-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * These loggers have been configured to output messages to the console and a {@code .log} file by default,","lastModifiedDate":"2016-09-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * at the {@code INFO} level. A new {@code .log} file with a new numbering will be created after the log","lastModifiedDate":"2016-09-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * file reaches 5MB big, up to a maximum of 5 files.\u003cbr\u003e","lastModifiedDate":"2016-09-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class LogsCenter {","lastModifiedDate":"2016-09-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final int MAX_FILE_COUNT \u003d 5;","lastModifiedDate":"2016-09-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final int MAX_FILE_SIZE_IN_BYTES \u003d (int) (Math.pow(2, 20) * 5); // 5MB","lastModifiedDate":"2016-09-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String LOG_FILE \u003d \"addressbook.log\";","lastModifiedDate":"2016-09-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final Logger logger; // logger for this class","lastModifiedDate":"2023-07-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static Logger baseLogger; // to be used as the parent of all other loggers created by this class.","lastModifiedDate":"2023-07-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static Level currentLogLevel \u003d Level.INFO;","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // This static block ensures essential loggers are created early","lastModifiedDate":"2023-07-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2023-07-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" setBaseLogger();","lastModifiedDate":"2023-07-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" logger \u003d LogsCenter.getLogger(LogsCenter.class);","lastModifiedDate":"2023-07-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Initializes loggers with the log level specified in the {@code config} object. Applies to all loggers created","lastModifiedDate":"2023-07-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * using {@link #getLogger(String)} and {@link #getLogger(Class)} methods except for those that are manually set.","lastModifiedDate":"2023-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static void init(Config config) {","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" currentLogLevel \u003d config.getLogLevel();","lastModifiedDate":"2016-09-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" logger.info(\"Log level will be set as: \" + currentLogLevel);","lastModifiedDate":"2023-07-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // set the level of the baseLogger which will be inherited by other loggers","lastModifiedDate":"2023-07-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" baseLogger.setLevel(currentLogLevel);","lastModifiedDate":"2023-07-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Creates a logger with the given name prefixed by the {@code baseLogger}\u0027s name so that the created logger","lastModifiedDate":"2023-07-19"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * becomes a descendant of the {@code baseLogger}. Furthermore, the returned logger will have the same log handlers","lastModifiedDate":"2023-07-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * as the {@code baseLogger}.","lastModifiedDate":"2023-07-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static Logger getLogger(String name) {","lastModifiedDate":"2016-09-28"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Java organizes loggers into a hierarchy based on their names (using \u0027.\u0027 as a separator, similar to how Java","lastModifiedDate":"2023-07-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // packages form a hierarchy). Furthermore, loggers without a level inherit the level of their parent logger.","lastModifiedDate":"2023-07-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // By prefixing names of all loggers with baseLogger\u0027s name + \".\", we make the baseLogger the parent of all","lastModifiedDate":"2023-07-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // loggers. This allows us to change the level of all loggers simply by changing the baseLogger level.","lastModifiedDate":"2023-07-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Logger logger \u003d Logger.getLogger(baseLogger.getName() + \".\" + name);","lastModifiedDate":"2023-07-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" removeHandlers(logger);","lastModifiedDate":"2016-09-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":" logger.setUseParentHandlers(true);","lastModifiedDate":"2023-07-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return logger;","lastModifiedDate":"2023-07-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Creates a Logger for the given class name.","lastModifiedDate":"2017-01-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Logger getLogger(Class\u003cT\u003e clazz) {","lastModifiedDate":"2017-01-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" requireNonNull(clazz);","lastModifiedDate":"2023-05-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return getLogger(clazz.getSimpleName());","lastModifiedDate":"2017-01-16"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Removes all handlers from the {@code logger}.","lastModifiedDate":"2023-07-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static void removeHandlers(Logger logger) {","lastModifiedDate":"2016-09-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Arrays.stream(logger.getHandlers())","lastModifiedDate":"2018-01-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .forEach(logger::removeHandler);","lastModifiedDate":"2018-01-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Creates a logger named \u0027ab3\u0027, containing a {@code ConsoleHandler} and a {@code FileHandler}.","lastModifiedDate":"2023-07-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Sets it as the {@code baseLogger}, to be used as the parent logger of all other loggers.","lastModifiedDate":"2023-07-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static void setBaseLogger() {","lastModifiedDate":"2023-07-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" baseLogger \u003d Logger.getLogger(\"ab3\");","lastModifiedDate":"2023-07-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" baseLogger.setUseParentHandlers(false);","lastModifiedDate":"2023-07-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" removeHandlers(baseLogger);","lastModifiedDate":"2023-07-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" // Level.ALL is used as the level for the handlers because the baseLogger filters the log messages by level","lastModifiedDate":"2023-07-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // already; there is no need to control log message level of the handlers.","lastModifiedDate":"2023-07-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // add a ConsoleHandler to log to the console","lastModifiedDate":"2023-07-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" ConsoleHandler consoleHandler \u003d new ConsoleHandler();","lastModifiedDate":"2023-07-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" consoleHandler.setLevel(Level.ALL);","lastModifiedDate":"2023-07-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" baseLogger.addHandler(consoleHandler);","lastModifiedDate":"2023-07-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // add a FileHandler to log to a file","lastModifiedDate":"2023-07-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-09"},{"lineNumber":96,"author":{"gitId":"-"},"content":" FileHandler fileHandler \u003d new FileHandler(LOG_FILE, MAX_FILE_SIZE_IN_BYTES, MAX_FILE_COUNT, true);","lastModifiedDate":"2023-07-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" fileHandler.setFormatter(new SimpleFormatter());","lastModifiedDate":"2023-07-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" fileHandler.setLevel(Level.ALL);","lastModifiedDate":"2023-07-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" baseLogger.addHandler(fileHandler);","lastModifiedDate":"2023-07-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-09"},{"lineNumber":101,"author":{"gitId":"-"},"content":" logger.warning(\"Error adding file handler for logger.\");","lastModifiedDate":"2016-09-09"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":105}},{"path":"src/main/java/tutorpro/commons/core/Version.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Represents a version with major, minor and patch number","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Version implements Comparable\u003cVersion\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String VERSION_REGEX \u003d \"V(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)(ea)?\";","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String EXCEPTION_STRING_NOT_VERSION \u003d \"String is not a valid Version. %s\";","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Pattern VERSION_PATTERN \u003d Pattern.compile(VERSION_REGEX);","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final int major;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final int minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final int patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final boolean isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code Version} with the given version details.","lastModifiedDate":"2020-05-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public Version(int major, int minor, int patch, boolean isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.major \u003d major;","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.minor \u003d minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.patch \u003d patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.isEarlyAccess \u003d isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public int getMajor() {","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return major;","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public int getMinor() {","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public int getPatch() {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean isEarlyAccess() {","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Parses a version number string in the format V1.2.3.","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * @param versionString version number string","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * @return a Version object","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static Version fromString(String versionString) throws IllegalArgumentException {","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Matcher versionMatcher \u003d VERSION_PATTERN.matcher(versionString);","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" if (!versionMatcher.find()) {","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(String.format(EXCEPTION_STRING_NOT_VERSION, versionString));","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new Version(Integer.parseInt(versionMatcher.group(1)),","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Integer.parseInt(versionMatcher.group(2)),","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" Integer.parseInt(versionMatcher.group(3)),","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" versionMatcher.group(4) \u003d\u003d null ? false : true);","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @JsonValue","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return String.format(\"V%d.%d.%d%s\", major, minor, patch, isEarlyAccess ? \"ea\" : \"\");","lastModifiedDate":"2016-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public int compareTo(Version other) {","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (major !\u003d other.major) {","lastModifiedDate":"2018-08-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return major - other.major;","lastModifiedDate":"2018-08-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" if (minor !\u003d other.minor) {","lastModifiedDate":"2018-08-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return minor - other.minor;","lastModifiedDate":"2018-08-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":83,"author":{"gitId":"-"},"content":" if (patch !\u003d other.patch) {","lastModifiedDate":"2018-08-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return patch - other.patch;","lastModifiedDate":"2018-08-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (isEarlyAccess \u003d\u003d other.isEarlyAccess()) {","lastModifiedDate":"2018-08-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return 0;","lastModifiedDate":"2017-05-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (isEarlyAccess) {","lastModifiedDate":"2018-08-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return -1;","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return 1;","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (!(other instanceof Version)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Version otherVersion \u003d (Version) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return major \u003d\u003d otherVersion.major","lastModifiedDate":"2023-07-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \u0026\u0026 minor \u003d\u003d otherVersion.minor","lastModifiedDate":"2023-07-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \u0026\u0026 patch \u003d\u003d otherVersion.patch","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" \u0026\u0026 isEarlyAccess \u003d\u003d otherVersion.isEarlyAccess;","lastModifiedDate":"2023-07-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" String hash \u003d String.format(\"%03d%03d%03d\", major, minor, patch);","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" if (!isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" hash \u003d \"1\" + hash;","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return Integer.parseInt(hash);","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":120}},{"path":"src/main/java/tutorpro/commons/core/index/Index.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core.index;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Represents a zero-based or one-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * {@code Index} should be used right from the start (when parsing in a new user input), so that if the current","lastModifiedDate":"2017-05-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * component wants to communicate with another component, it can send an {@code Index} to avoid having to know what","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * base the other component is using for its index. However, after receiving the {@code Index}, that component can","lastModifiedDate":"2017-05-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * convert it back to an int if the index will not be passed to a different component again.","lastModifiedDate":"2017-05-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Index {","lastModifiedDate":"2017-05-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private int zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Index can only be created by calling {@link Index#fromZeroBased(int)} or","lastModifiedDate":"2017-05-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * {@link Index#fromOneBased(int)}.","lastModifiedDate":"2017-05-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Index(int zeroBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" if (zeroBasedIndex \u003c 0) {","lastModifiedDate":"2017-05-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" throw new IndexOutOfBoundsException();","lastModifiedDate":"2017-05-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" this.zeroBasedIndex \u003d zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public int getZeroBased() {","lastModifiedDate":"2017-05-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public int getOneBased() {","lastModifiedDate":"2017-05-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return zeroBasedIndex + 1;","lastModifiedDate":"2017-05-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Creates a new {@code Index} using a zero-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static Index fromZeroBased(int zeroBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return new Index(zeroBasedIndex);","lastModifiedDate":"2017-05-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Creates a new {@code Index} using a one-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static Index fromOneBased(int oneBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return new Index(oneBasedIndex - 1);","lastModifiedDate":"2017-05-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (!(other instanceof Index)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Index otherIndex \u003d (Index) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return zeroBasedIndex \u003d\u003d otherIndex.zeroBasedIndex;","lastModifiedDate":"2023-07-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"zeroBasedIndex\", zeroBasedIndex).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"Wyrkx":2,"-":67}},{"path":"src/main/java/tutorpro/commons/exceptions/DataLoadingException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-14"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2023-06-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents an error during loading of data from a file.","lastModifiedDate":"2023-06-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-06-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class DataLoadingException extends Exception {","lastModifiedDate":"2023-06-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public DataLoadingException(Exception cause) {","lastModifiedDate":"2023-06-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(cause);","lastModifiedDate":"2023-06-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-14"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2023-06-14"}],"authorContributionMap":{"Wyrkx":1,"-":10}},{"path":"src/main/java/tutorpro/commons/exceptions/IllegalValueException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that some given data does not fulfill some constraints.","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class IllegalValueException extends Exception {","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * @param message should contain relevant information on the failed constraint(s)","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public IllegalValueException(String message) {","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * @param message should contain relevant information on the failed constraint(s)","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * @param cause of the main exception","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public IllegalValueException(String message, Throwable cause) {","lastModifiedDate":"2017-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":1,"-":20}},{"path":"src/main/java/tutorpro/commons/util/AppUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.scene.image.Image;","lastModifiedDate":"2016-08-18"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * A container for App specific utility functions","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AppUtil {","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Gets an {@code Image} from the specified path.","lastModifiedDate":"2020-05-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static Image getImage(String imagePath) {","lastModifiedDate":"2016-08-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":" requireNonNull(imagePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" return new Image(MainApp.class.getResourceAsStream(imagePath));","lastModifiedDate":"2016-08-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Checks that {@code condition} is true. Used for validating arguments to methods.","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException if {@code condition} is false.","lastModifiedDate":"2017-05-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static void checkArgument(Boolean condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (!condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException();","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Checks that {@code condition} is true. Used for validating arguments to methods.","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException with {@code errorMessage} if {@code condition} is false.","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static void checkArgument(Boolean condition, String errorMessage) {","lastModifiedDate":"2017-05-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (!condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(errorMessage);","lastModifiedDate":"2017-05-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":2,"-":40}},{"path":"src/main/java/tutorpro/commons/util/CollectionUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-06-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-30"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2016-12-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Utility methods related to Collections","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class CollectionUtil {","lastModifiedDate":"2016-09-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /** @see #requireAllNonNull(Collection) */","lastModifiedDate":"2017-05-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static void requireAllNonNull(Object... items) {","lastModifiedDate":"2017-05-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":" requireNonNull(items);","lastModifiedDate":"2017-06-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Stream.of(items).forEach(Objects::requireNonNull);","lastModifiedDate":"2017-05-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Throws NullPointerException if {@code items} or any element of {@code items} is null.","lastModifiedDate":"2017-05-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static void requireAllNonNull(Collection\u003c?\u003e items) {","lastModifiedDate":"2017-05-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(items);","lastModifiedDate":"2017-06-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" items.forEach(Objects::requireNonNull);","lastModifiedDate":"2017-05-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns true if {@code items} contain any elements that are non-null.","lastModifiedDate":"2017-06-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static boolean isAnyNonNull(Object... items) {","lastModifiedDate":"2017-06-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return items !\u003d null \u0026\u0026 Arrays.stream(items).anyMatch(Objects::nonNull);","lastModifiedDate":"2017-06-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":1,"-":34}},{"path":"src/main/java/tutorpro/commons/util/ConfigUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Config;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * A class for accessing the Config File.","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class ConfigUtil {","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static Optional\u003cConfig\u003e readConfig(Path configFilePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":16,"author":{"gitId":"-"},"content":" return JsonUtil.readJsonFile(configFilePath, Config.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static void saveConfig(Config config, Path configFilePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(config, configFilePath);","lastModifiedDate":"2016-10-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":3,"-":20}},{"path":"src/main/java/tutorpro/commons/util/FileUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2016-08-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.InvalidPathException;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Writes and reads files","lastModifiedDate":"2016-10-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class FileUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String CHARSET \u003d \"UTF-8\";","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static boolean isFileExists(Path file) {","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" return Files.exists(file) \u0026\u0026 Files.isRegularFile(file);","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Returns true if {@code path} can be converted into a {@code Path} via {@link Paths#get(String)},","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * otherwise returns false.","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param path A string representing the file path. Cannot be null.","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static boolean isValidPath(String path) {","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Paths.get(path);","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" } catch (InvalidPathException ipe) {","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Creates a file if it does not exist along with its missing parent directories.","lastModifiedDate":"2017-08-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @throws IOException if the file or directory cannot be created.","lastModifiedDate":"2017-08-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static void createIfMissing(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (!isFileExists(file)) {","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" createFile(file);","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Creates a file if it does not exist along with its missing parent directories.","lastModifiedDate":"2018-04-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static void createFile(Path file) throws IOException {","lastModifiedDate":"2018-04-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (Files.exists(file)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2018-04-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" createParentDirsOfFile(file);","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Files.createFile(file);","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Creates parent directories of file if it has a parent directory","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static void createParentDirsOfFile(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Path parentDir \u003d file.getParent();","lastModifiedDate":"2018-04-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (parentDir !\u003d null) {","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Files.createDirectories(parentDir);","lastModifiedDate":"2018-04-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Assumes file exists","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static String readFromFile(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return new String(Files.readAllBytes(file), CHARSET);","lastModifiedDate":"2018-04-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Writes given string to a file.","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Will create the file if it does not exist yet.","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static void writeToFile(Path file, String content) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Files.write(file, content.getBytes(CHARSET));","lastModifiedDate":"2018-04-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":82}},{"path":"src/main/java/tutorpro/commons/util/JsonUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonAutoDetect;","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.PropertyAccessor;","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.core.JsonProcessingException;","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationContext;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationFeature;","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ObjectMapper;","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.SerializationFeature;","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.module.SimpleModule;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Converts a Java object instance to JSON and vice versa","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class JsonUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonUtil.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static ObjectMapper objectMapper \u003d new ObjectMapper().findAndRegisterModules()","lastModifiedDate":"2016-10-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)","lastModifiedDate":"2016-10-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)","lastModifiedDate":"2016-10-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":" .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)","lastModifiedDate":"2016-10-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)","lastModifiedDate":"2016-10-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .registerModule(new SimpleModule(\"SimpleModule\")","lastModifiedDate":"2016-10-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .addSerializer(Level.class, new ToStringSerializer())","lastModifiedDate":"2016-10-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .addDeserializer(Level.class, new LevelDeserializer(Level.class)));","lastModifiedDate":"2016-10-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" static \u003cT\u003e void serializeObjectToJsonFile(Path jsonFile, T objectToSerialize) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(jsonFile, toJsonString(objectToSerialize));","lastModifiedDate":"2016-10-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" static \u003cT\u003e T deserializeObjectFromJsonFile(Path jsonFile, Class\u003cT\u003e classOfObjectToDeserialize)","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return fromJsonString(FileUtil.readFromFile(jsonFile), classOfObjectToDeserialize);","lastModifiedDate":"2016-10-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns the JSON object from the given file or {@code Optional.empty()} object if the file is not found.","lastModifiedDate":"2023-06-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * If any values are missing from the file, default values will be used, as long as the file is a valid JSON file.","lastModifiedDate":"2023-06-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * @param filePath cannot be null.","lastModifiedDate":"2016-10-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @param classOfObjectToDeserialize JSON file has to correspond to the structure in the class given here.","lastModifiedDate":"2023-06-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading of the JSON file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Optional\u003cT\u003e readJsonFile(","lastModifiedDate":"2016-10-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Path filePath, Class\u003cT\u003e classOfObjectToDeserialize) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!Files.exists(filePath)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2016-10-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.info(\"JSON file \" + filePath + \" found.\");","lastModifiedDate":"2023-01-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" T jsonFile;","lastModifiedDate":"2016-10-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-10-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":" jsonFile \u003d deserializeObjectFromJsonFile(filePath, classOfObjectToDeserialize);","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-10-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" logger.warning(\"Error reading from jsonFile file \" + filePath + \": \" + e);","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new DataLoadingException(e);","lastModifiedDate":"2023-06-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Optional.of(jsonFile);","lastModifiedDate":"2016-10-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Saves the Json object to the specified file.","lastModifiedDate":"2016-10-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * Overwrites existing file if it exists, creates a new file if it doesn\u0027t.","lastModifiedDate":"2016-10-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param jsonFile cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param filePath cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @throws IOException if there was an error during writing to the file","lastModifiedDate":"2016-10-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public static \u003cT\u003e void saveJsonFile(T jsonFile, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" requireNonNull(jsonFile);","lastModifiedDate":"2017-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" serializeObjectToJsonFile(filePath, jsonFile);","lastModifiedDate":"2018-04-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Converts a given string representation of a JSON data to instance of a class","lastModifiedDate":"2016-10-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * @return The instance of T with the specified values in the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public static \u003cT\u003e T fromJsonString(String json, Class\u003cT\u003e instanceClass) throws IOException {","lastModifiedDate":"2016-10-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return objectMapper.readValue(json, instanceClass);","lastModifiedDate":"2016-10-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Converts a given instance of a class into its JSON data string representation","lastModifiedDate":"2016-10-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @param instance The T object to be converted into the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @return JSON data representation of the given class instance, in string","lastModifiedDate":"2016-10-19"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static \u003cT\u003e String toJsonString(T instance) throws JsonProcessingException {","lastModifiedDate":"2016-10-19"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(instance);","lastModifiedDate":"2016-10-19"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Contains methods that retrieve logging level from serialized string.","lastModifiedDate":"2017-08-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private static class LevelDeserializer extends FromStringDeserializer\u003cLevel\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" protected LevelDeserializer(Class\u003c?\u003e vc) {","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" super(vc);","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" protected Level _deserialize(String value, DeserializationContext ctxt) {","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return getLoggingLevel(value);","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Gets the logging level that matches loggingLevelString","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * \u003cp\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Returns null if there are no matches","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private Level getLoggingLevel(String loggingLevelString) {","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return Level.parse(loggingLevelString);","lastModifiedDate":"2016-09-09"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public Class\u003cLevel\u003e handledType() {","lastModifiedDate":"2016-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return Level.class;","lastModifiedDate":"2016-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":3,"-":141}},{"path":"src/main/java/tutorpro/commons/util/StringUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.PrintWriter;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.StringWriter;","lastModifiedDate":"2016-09-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Helper functions for handling strings.","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class StringUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Returns true if the {@code sentence} contains the {@code word}.","lastModifiedDate":"2016-10-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Ignores case, but a full word match is required.","lastModifiedDate":"2016-10-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * \u003cbr\u003eexamples:\u003cpre\u003e","lastModifiedDate":"2016-10-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"abc\") \u003d\u003d true","lastModifiedDate":"2016-10-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"DEF\") \u003d\u003d true","lastModifiedDate":"2016-10-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"AB\") \u003d\u003d false //not a full word match","lastModifiedDate":"2016-10-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * \u003c/pre\u003e","lastModifiedDate":"2016-10-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param sentence cannot be null","lastModifiedDate":"2016-10-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @param word cannot be null, cannot be empty, must be a single word","lastModifiedDate":"2016-10-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static boolean containsWordIgnoreCase(String sentence, String word) {","lastModifiedDate":"2016-10-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" requireNonNull(sentence);","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(word);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" String preppedWord \u003d word.trim();","lastModifiedDate":"2016-10-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" checkArgument(!preppedWord.isEmpty(), \"Word parameter cannot be empty\");","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" checkArgument(preppedWord.split(\"\\\\s+\").length \u003d\u003d 1, \"Word parameter should be a single word\");","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String preppedSentence \u003d sentence;","lastModifiedDate":"2016-10-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" String[] wordsInPreppedSentence \u003d preppedSentence.split(\"\\\\s+\");","lastModifiedDate":"2016-10-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return Arrays.stream(wordsInPreppedSentence)","lastModifiedDate":"2018-01-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .anyMatch(preppedWord::equalsIgnoreCase);","lastModifiedDate":"2018-01-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Returns a detailed message of the t, including the stack trace.","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static String getDetails(Throwable t) {","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(t);","lastModifiedDate":"2017-05-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" StringWriter sw \u003d new StringWriter();","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" t.printStackTrace(new PrintWriter(sw));","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return t.getMessage() + \"\\n\" + sw.toString();","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns true if {@code s} represents a non-zero unsigned integer","lastModifiedDate":"2017-06-02"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * e.g. 1, 2, 3, ..., {@code Integer.MAX_VALUE} \u003cbr\u003e","lastModifiedDate":"2017-06-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Will return false for any other non-null string input","lastModifiedDate":"2017-06-02"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * e.g. empty string, \"-1\", \"0\", \"+1\", and \" 2 \" (untrimmed), \"3 0\" (contains whitespace), \"1 a\" (contains letters)","lastModifiedDate":"2017-06-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code s} is null.","lastModifiedDate":"2017-06-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static boolean isNonZeroUnsignedInteger(String s) {","lastModifiedDate":"2017-06-02"},{"lineNumber":59,"author":{"gitId":"-"},"content":" requireNonNull(s);","lastModifiedDate":"2017-06-02"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-06-02"},{"lineNumber":62,"author":{"gitId":"-"},"content":" int value \u003d Integer.parseInt(s);","lastModifiedDate":"2017-06-02"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return value \u003e 0 \u0026\u0026 !s.startsWith(\"+\"); // \"+1\" is successfully parsed by Integer#parseInt(String)","lastModifiedDate":"2017-06-02"},{"lineNumber":64,"author":{"gitId":"-"},"content":" } catch (NumberFormatException nfe) {","lastModifiedDate":"2017-06-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-06-02"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-02"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":66}},{"path":"src/main/java/tutorpro/commons/util/ToStringBuilder.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Builds a string representation of an object that is suitable as the return value of {@link Object#toString()}.","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class ToStringBuilder {","lastModifiedDate":"2019-02-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" private static final String OBJECT_PREFIX \u003d \"{\";","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" private static final String OBJECT_SUFFIX \u003d \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" private static final String FIELD_SEPARATOR \u003d \", \";","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" private static final String FIELD_NAME_VALUE_SEPARATOR \u003d \"\u003d\";","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private final StringBuilder stringBuilder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private boolean hasField;","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Constructs a {@code ToStringBuilder} whose formatted output will be prefixed with {@code objectName}.","lastModifiedDate":"2019-02-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public ToStringBuilder(String objectName) {","lastModifiedDate":"2019-02-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" stringBuilder.append(objectName).append(OBJECT_PREFIX);","lastModifiedDate":"2019-02-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code ToStringBuilder} whose formatted output will be prefixed with the","lastModifiedDate":"2019-02-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * canonical class name of {@code object}.","lastModifiedDate":"2019-02-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public ToStringBuilder(Object object) {","lastModifiedDate":"2019-02-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this(object.getClass().getCanonicalName());","lastModifiedDate":"2019-02-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Adds a field name/value pair to the output string.","lastModifiedDate":"2019-02-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @param fieldName The name of the field.","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @param fieldValue The value of the field.","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @return A reference to this {@code ToStringBuilder} object, allowing method calls to be chained.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public ToStringBuilder add(String fieldName, Object fieldValue) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (hasField) {","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" stringBuilder.append(FIELD_SEPARATOR);","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" stringBuilder.append(fieldName).append(FIELD_NAME_VALUE_SEPARATOR).append(fieldValue);","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" hasField \u003d true;","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns the built formatted string representation.","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return stringBuilder.toString() + OBJECT_SUFFIX;","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-23"}],"authorContributionMap":{"Wyrkx":1,"-":52}},{"path":"src/main/java/tutorpro/logic/Logic.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-09-25"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * API of the Logic component","lastModifiedDate":"2016-09-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2016-09-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2016-09-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2016-09-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2017-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Returns the AddressBook.","lastModifiedDate":"2018-12-03"},{"lineNumber":29,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-03"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" * @see Model#getAddressBook()","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook getAddressBook();","lastModifiedDate":"2018-12-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /** Returns an unmodifiable view of the filtered list of persons */","lastModifiedDate":"2017-09-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getFilteredPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Set the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" void setGuiSettings(GuiSettings guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"Wyrkx":9,"-":42}},{"path":"src/main/java/tutorpro/logic/LogicManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-09-24"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.AddressBookParser;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.Storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * The main LogicManager of the app.","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class LogicManager implements Logic {","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String FILE_OPS_ERROR_FORMAT \u003d \"Could not save data due to the following error: %s\";","lastModifiedDate":"2023-06-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String FILE_OPS_PERMISSION_ERROR_FORMAT \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \"Could not save data to file %s due to insufficient permissions to write to the file or the folder.\";","lastModifiedDate":"2023-06-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(LogicManager.class);","lastModifiedDate":"2016-09-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private final Model model;","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private final Storage storage;","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private final AddressBookParser addressBookParser;","lastModifiedDate":"2017-07-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Constructs a {@code LogicManager} with the given {@code Model} and {@code Storage}.","lastModifiedDate":"2020-05-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public LogicManager(Model model, Storage storage) {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.model \u003d model;","lastModifiedDate":"2016-09-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.storage \u003d storage;","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" addressBookParser \u003d new AddressBookParser();","lastModifiedDate":"2018-01-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText) throws CommandException, ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2016-09-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2017-07-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2019-01-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" } catch (AccessDeniedException e) {","lastModifiedDate":"2023-06-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" throw new CommandException(String.format(FILE_OPS_PERMISSION_ERROR_FORMAT, e.getMessage()), e);","lastModifiedDate":"2023-06-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2018-12-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" throw new CommandException(String.format(FILE_OPS_ERROR_FORMAT, ioe.getMessage()), ioe);","lastModifiedDate":"2023-06-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2018-12-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return model.getAddressBook();","lastModifiedDate":"2018-12-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-03"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return model.getFilteredPersonList();","lastModifiedDate":"2016-09-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return model.getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return model.getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" model.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"Wyrkx":12,"-":76}},{"path":"src/main/java/tutorpro/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.Prefix;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":48}},{"path":"src/main/java/tutorpro/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":11,"-":73}},{"path":"src/main/java/tutorpro/logic/commands/ClearCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Clears the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class ClearCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"clear\";","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Address book has been cleared!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":" model.setAddressBook(new AddressBook());","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":20}},{"path":"src/main/java/tutorpro/logic/commands/Command.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a command with hidden internal logic and the ability to be executed.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public abstract class Command {","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Executes the command and returns the result message.","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * @param model {@code Model} which the command should operate on.","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * @return feedback message of the operation result for display","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public abstract CommandResult execute(Model model) throws CommandException;","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":17}},{"path":"src/main/java/tutorpro/logic/commands/CommandResult.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2018-12-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Represents the result of a command execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class CommandResult {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final String feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /** Help information should be shown to the user. */","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private final boolean showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /** The application should exit. */","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final boolean exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified fields.","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser, boolean showHelp, boolean exit) {","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.feedbackToUser \u003d requireNonNull(feedbackToUser);","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.showHelp \u003d showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.exit \u003d exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified {@code feedbackToUser},","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * and other fields set to their default value.","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser) {","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this(feedbackToUser, false, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public String getFeedbackToUser() {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public boolean isShowHelp() {","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean isExit() {","lastModifiedDate":"2018-12-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2018-12-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" if (!(other instanceof CommandResult)) {","lastModifiedDate":"2018-12-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-12-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" CommandResult otherCommandResult \u003d (CommandResult) other;","lastModifiedDate":"2018-12-09"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return feedbackToUser.equals(otherCommandResult.feedbackToUser)","lastModifiedDate":"2018-12-09"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u0026\u0026 showHelp \u003d\u003d otherCommandResult.showHelp","lastModifiedDate":"2018-12-09"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u0026\u0026 exit \u003d\u003d otherCommandResult.exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2018-12-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return Objects.hash(feedbackToUser, showHelp, exit);","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .add(\"feedbackToUser\", feedbackToUser)","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .add(\"showHelp\", showHelp)","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .add(\"exit\", exit)","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":2,"-":80}},{"path":"src/main/java/tutorpro/logic/commands/DeleteCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-09-01"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Deletes a person identified using it\u0027s displayed index from the address book.","lastModifiedDate":"2018-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class DeleteCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"delete\";","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \": Deletes the person identified by the index number used in the displayed person list.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer)\\n\"","lastModifiedDate":"2016-09-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1\";","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_PERSON_SUCCESS \u003d \"Deleted Person: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Index targetIndex;","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public DeleteCommand(Index targetIndex) {","lastModifiedDate":"2017-05-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.targetIndex \u003d targetIndex;","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (targetIndex.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personToDelete \u003d lastShownList.get(targetIndex.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" model.deletePerson(personToDelete);","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(personToDelete)));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (!(other instanceof DeleteCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" DeleteCommand otherDeleteCommand \u003d (DeleteCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return targetIndex.equals(otherDeleteCommand.targetIndex);","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .add(\"targetIndex\", targetIndex)","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":7,"-":62}},{"path":"src/main/java/tutorpro/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":63,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":86,"author":{"gitId":"Wyrkx"},"content":" model.updateFilteredPersonList(Model.PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2017-03-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":135,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":136,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":137,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":138,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":141,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":146,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":148,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":149,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":155,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);","lastModifiedDate":"2018-08-14"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":163,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":170,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":178,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":179,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":182,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":183,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":184,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":187,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":188,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":194,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":195,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":196,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":197,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":198,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":199,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":202,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":203,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":204,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":205,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":206,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":207,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":208,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":211,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":212,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":213,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":214,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":215,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":217,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":219,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":220,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":222,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":223,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":224,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":225,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":226,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":227,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":228,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":241,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"Wyrkx":19,"-":222}},{"path":"src/main/java/tutorpro/logic/commands/ExitCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Terminates the program.","lastModifiedDate":"2016-09-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class ExitCommand extends Command {","lastModifiedDate":"2016-09-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"exit\";","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EXIT_ACKNOWLEDGEMENT \u003d \"Exiting Address Book as requested ...\";","lastModifiedDate":"2016-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true);","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"Wyrkx":2,"-":17}},{"path":"src/main/java/tutorpro/logic/commands/FindCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Finds and lists all persons in address book whose name contains any of the argument keywords.","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Keyword matching is case insensitive.","lastModifiedDate":"2018-04-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommand extends Command {","lastModifiedDate":"2016-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"find\";","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Finds all persons whose names contain any of \"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"the specified keywords (case-insensitive) and displays them as a list with index numbers.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"Parameters: KEYWORD [MORE_KEYWORDS]...\\n\"","lastModifiedDate":"2016-09-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" alice bob charlie\";","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final NameContainsKeywordsPredicate predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public FindCommand(NameContainsKeywordsPredicate predicate) {","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.predicate \u003d predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new CommandResult(","lastModifiedDate":"2018-04-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size()));","lastModifiedDate":"2018-04-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof FindCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" FindCommand otherFindCommand \u003d (FindCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return predicate.equals(otherFindCommand.predicate);","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .add(\"predicate\", predicate)","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"Wyrkx":5,"-":53}},{"path":"src/main/java/tutorpro/logic/commands/HelpCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-31"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Format full help instructions for every command for display.","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class HelpCommand extends Command {","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"help\";","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Shows program usage instructions.\\n\"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD;","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String SHOWING_HELP_MESSAGE \u003d \"Opened help window.\";","lastModifiedDate":"2016-08-31"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" return new CommandResult(SHOWING_HELP_MESSAGE, true, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":2,"-":19}},{"path":"src/main/java/tutorpro/logic/commands/ListCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Lists all persons in the address book to the user.","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class ListCommand extends Command {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"list\";","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Listed all persons\";","lastModifiedDate":"2016-09-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" model.updateFilteredPersonList(Model.PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":20}},{"path":"src/main/java/tutorpro/logic/commands/exceptions/CommandException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents an error which occurs during execution of a {@link Command}.","lastModifiedDate":"2017-02-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CommandException extends Exception {","lastModifiedDate":"2017-02-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public CommandException(String message) {","lastModifiedDate":"2017-02-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Constructs a new {@code CommandException} with the specified detail {@code message} and {@code cause}.","lastModifiedDate":"2018-08-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public CommandException(String message, Throwable cause) {","lastModifiedDate":"2018-08-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2018-08-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"Wyrkx":1,"-":16}},{"path":"src/main/java/tutorpro/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":36,"author":{"gitId":"-"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2017-12-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Person person \u003d new Person(name, phone, email, address, tagList);","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"Wyrkx":15,"-":46}},{"path":"src/main/java/tutorpro/logic/parser/AddressBookParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ClearCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ExitCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.HelpCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ListCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses user input.","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookParser {","lastModifiedDate":"2017-07-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Used for initial separation of command word and args.","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Pattern BASIC_COMMAND_FORMAT \u003d Pattern.compile(\"(?\u003ccommandWord\u003e\\\\S+)(?\u003carguments\u003e.*)\");","lastModifiedDate":"2016-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AddressBookParser.class);","lastModifiedDate":"2023-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Parses user input into command for execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param userInput full user input string","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @return the command based on the user input","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" final Matcher matcher \u003d BASIC_COMMAND_FORMAT.matcher(userInput.trim());","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!matcher.matches()) {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Note to developers: Change the log level in config.json to enable lower level (i.e., FINE, FINER and lower)","lastModifiedDate":"2023-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // log messages such as the one below.","lastModifiedDate":"2023-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Lower level log messages are used sparingly to minimize noise in the code.","lastModifiedDate":"2023-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logger.fine(\"Command word: \" + commandWord + \"; Arguments: \" + arguments);","lastModifiedDate":"2023-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" switch (commandWord) {","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" case AddCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return new AddCommandParser().parse(arguments);","lastModifiedDate":"2017-02-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2016-12-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":" case DeleteCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return new DeleteCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" case ClearCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new ClearCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" case FindCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return new FindCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" case ListCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return new ListCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" case ExitCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ExitCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" case HelpCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new HelpCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" default:","lastModifiedDate":"2016-08-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" logger.finer(\"This user input caused a ParseException: \" + userInput);","lastModifiedDate":"2023-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":14,"-":72}},{"path":"src/main/java/tutorpro/logic/parser/ArgumentMultimap.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2017-03-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-03-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2017-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Stores mapping of prefixes to their respective arguments.","lastModifiedDate":"2017-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Each key may be associated with multiple argument values.","lastModifiedDate":"2017-03-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Values for a given key are stored in a list, and the insertion ordering is maintained.","lastModifiedDate":"2017-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Keys are unique, but the list of argument values may contain duplicate argument values, i.e. the same argument value","lastModifiedDate":"2017-03-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * can be inserted multiple times for the same prefix.","lastModifiedDate":"2017-03-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ArgumentMultimap {","lastModifiedDate":"2017-03-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /** Prefixes mapped to their respective arguments**/","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final Map\u003cPrefix, List\u003cString\u003e\u003e argMultimap \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2017-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Associates the specified argument value with {@code prefix} key in this map.","lastModifiedDate":"2017-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * If the map previously contained a mapping for the key, the new value is appended to the list of existing values.","lastModifiedDate":"2017-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @param prefix Prefix key with which the specified argument value is to be associated","lastModifiedDate":"2017-03-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @param argValue Argument value to be associated with the specified prefix key","lastModifiedDate":"2017-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void put(Prefix prefix, String argValue) {","lastModifiedDate":"2017-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" List\u003cString\u003e argValues \u003d getAllValues(prefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" argValues.add(argValue);","lastModifiedDate":"2017-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" argMultimap.put(prefix, argValues);","lastModifiedDate":"2017-03-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2017-03-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() : Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2017-03-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns all values of {@code prefix}.","lastModifiedDate":"2017-03-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * If the prefix does not exist or has no values, this will return an empty list.","lastModifiedDate":"2017-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Modifying the returned list will not affect the underlying data structure of the ArgumentMultimap.","lastModifiedDate":"2017-03-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getAllValues(Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (!argMultimap.containsKey(prefix)) {","lastModifiedDate":"2017-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e();","lastModifiedDate":"2017-03-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(argMultimap.get(prefix));","lastModifiedDate":"2017-03-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Returns the preamble (text before the first valid prefix). Trims any leading/trailing spaces.","lastModifiedDate":"2017-03-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public String getPreamble() {","lastModifiedDate":"2017-03-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return getValue(new Prefix(\"\")).orElse(\"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Throws a {@code ParseException} if any of the prefixes given in {@code prefixes} appeared more than","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * once among the arguments.","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void verifyNoDuplicatePrefixesFor(Prefix... prefixes) throws ParseException {","lastModifiedDate":"2023-07-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Prefix[] duplicatedPrefixes \u003d Stream.of(prefixes).distinct()","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .filter(prefix -\u003e argMultimap.containsKey(prefix) \u0026\u0026 argMultimap.get(prefix).size() \u003e 1)","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" .toArray(Prefix[]::new);","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (duplicatedPrefixes.length \u003e 0) {","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" throw new ParseException(Messages.getErrorMessageForDuplicatePrefixes(duplicatedPrefixes));","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-08"}],"authorContributionMap":{"Wyrkx":3,"-":75}},{"path":"src/main/java/tutorpro/logic/parser/ArgumentTokenizer.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-01-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-10-16"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Tokenizes arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * e.g. {@code some preamble text t/ 11.00 t/12.00 k/ m/ July} where prefixes are {@code t/ k/ m/}.\u003cbr\u003e","lastModifiedDate":"2017-05-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * 1. An argument\u0027s value can be an empty string e.g. the value of {@code k/} in the above example.\u003cbr\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * 2. Leading and trailing whitespaces of an argument value will be discarded.\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * 3. An argument may be repeated and all its values will be accumulated e.g. the value of {@code t/}","lastModifiedDate":"2017-05-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * in the above example.\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class ArgumentTokenizer {","lastModifiedDate":"2016-10-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap} object that maps prefixes to their","lastModifiedDate":"2017-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * respective argument values. Only the given prefixes will be recognized in the arguments string.","lastModifiedDate":"2017-03-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2017-03-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) {","lastModifiedDate":"2017-03-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" List\u003cPrefixPosition\u003e positions \u003d findAllPrefixPositions(argsString, prefixes);","lastModifiedDate":"2017-03-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return extractArguments(argsString, positions);","lastModifiedDate":"2017-03-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Finds all zero-based prefix positions in the given arguments string.","lastModifiedDate":"2017-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to find in the arguments string","lastModifiedDate":"2017-03-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @return List of zero-based prefix positions in the given arguments string","lastModifiedDate":"2017-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static List\u003cPrefixPosition\u003e findAllPrefixPositions(String argsString, Prefix... prefixes) {","lastModifiedDate":"2017-03-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return Arrays.stream(prefixes)","lastModifiedDate":"2018-01-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .flatMap(prefix -\u003e findPrefixPositions(argsString, prefix).stream())","lastModifiedDate":"2018-01-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-01-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * {@see findAllPrefixPositions}","lastModifiedDate":"2017-03-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private static List\u003cPrefixPosition\u003e findPrefixPositions(String argsString, Prefix prefix) {","lastModifiedDate":"2017-03-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" List\u003cPrefixPosition\u003e positions \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2016-10-16"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" int prefixPosition \u003d findPrefixPosition(argsString, prefix.getPrefix(), 0);","lastModifiedDate":"2017-05-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" while (prefixPosition !\u003d -1) {","lastModifiedDate":"2017-05-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" PrefixPosition extendedPrefix \u003d new PrefixPosition(prefix, prefixPosition);","lastModifiedDate":"2017-05-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" positions.add(extendedPrefix);","lastModifiedDate":"2016-10-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" prefixPosition \u003d findPrefixPosition(argsString, prefix.getPrefix(), prefixPosition);","lastModifiedDate":"2017-05-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return positions;","lastModifiedDate":"2016-10-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Returns the index of the first occurrence of {@code prefix} in","lastModifiedDate":"2017-05-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * {@code argsString} starting from index {@code fromIndex}. An occurrence","lastModifiedDate":"2017-05-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * is valid if there is a whitespace before {@code prefix}. Returns -1 if no","lastModifiedDate":"2017-05-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * such occurrence can be found.","lastModifiedDate":"2017-05-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * E.g if {@code argsString} \u003d \"e/hip/900\", {@code prefix} \u003d \"p/\" and","lastModifiedDate":"2017-05-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * {@code fromIndex} \u003d 0, this method returns -1 as there are no valid","lastModifiedDate":"2017-05-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * occurrences of \"p/\" with whitespace before it. However, if","lastModifiedDate":"2017-05-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * {@code argsString} \u003d \"e/hi p/900\", {@code prefix} \u003d \"p/\" and","lastModifiedDate":"2017-05-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * {@code fromIndex} \u003d 0, this method returns 5.","lastModifiedDate":"2017-05-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static int findPrefixPosition(String argsString, String prefix, int fromIndex) {","lastModifiedDate":"2017-05-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" int prefixIndex \u003d argsString.indexOf(\" \" + prefix, fromIndex);","lastModifiedDate":"2017-05-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return prefixIndex \u003d\u003d -1 ? -1","lastModifiedDate":"2017-05-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" : prefixIndex + 1; // +1 as offset for whitespace","lastModifiedDate":"2017-05-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Extracts prefixes and their argument values, and returns an {@code ArgumentMultimap} object that maps the","lastModifiedDate":"2017-03-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * extracted prefixes to their respective arguments. Prefixes are extracted based on their zero-based positions in","lastModifiedDate":"2017-03-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * {@code argsString}.","lastModifiedDate":"2017-03-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param prefixPositions Zero-based positions of all prefixes in {@code argsString}","lastModifiedDate":"2017-03-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static ArgumentMultimap extractArguments(String argsString, List\u003cPrefixPosition\u003e prefixPositions) {","lastModifiedDate":"2017-03-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // Sort by start position","lastModifiedDate":"2016-10-16"},{"lineNumber":90,"author":{"gitId":"-"},"content":" prefixPositions.sort((prefix1, prefix2) -\u003e prefix1.getStartPosition() - prefix2.getStartPosition());","lastModifiedDate":"2016-10-16"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // Insert a PrefixPosition to represent the preamble","lastModifiedDate":"2016-10-16"},{"lineNumber":93,"author":{"gitId":"-"},"content":" PrefixPosition preambleMarker \u003d new PrefixPosition(new Prefix(\"\"), 0);","lastModifiedDate":"2016-10-16"},{"lineNumber":94,"author":{"gitId":"-"},"content":" prefixPositions.add(0, preambleMarker);","lastModifiedDate":"2016-10-16"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // Add a dummy PrefixPosition to represent the end of the string","lastModifiedDate":"2016-10-16"},{"lineNumber":97,"author":{"gitId":"-"},"content":" PrefixPosition endPositionMarker \u003d new PrefixPosition(new Prefix(\"\"), argsString.length());","lastModifiedDate":"2016-10-16"},{"lineNumber":98,"author":{"gitId":"-"},"content":" prefixPositions.add(endPositionMarker);","lastModifiedDate":"2016-10-16"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // Map prefixes to their argument values (if any)","lastModifiedDate":"2017-03-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d new ArgumentMultimap();","lastModifiedDate":"2017-03-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c prefixPositions.size() - 1; i++) {","lastModifiedDate":"2016-10-16"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // Extract and store prefixes and their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Prefix argPrefix \u003d prefixPositions.get(i).getPrefix();","lastModifiedDate":"2017-03-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String argValue \u003d extractArgumentValue(argsString, prefixPositions.get(i), prefixPositions.get(i + 1));","lastModifiedDate":"2016-10-16"},{"lineNumber":106,"author":{"gitId":"-"},"content":" argMultimap.put(argPrefix, argValue);","lastModifiedDate":"2017-03-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return argMultimap;","lastModifiedDate":"2017-03-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Returns the trimmed value of the argument in the arguments string specified by {@code currentPrefixPosition}.","lastModifiedDate":"2017-03-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * The end position of the value is determined by {@code nextPrefixPosition}.","lastModifiedDate":"2017-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" private static String extractArgumentValue(String argsString,","lastModifiedDate":"2017-03-20"},{"lineNumber":117,"author":{"gitId":"-"},"content":" PrefixPosition currentPrefixPosition,","lastModifiedDate":"2016-10-16"},{"lineNumber":118,"author":{"gitId":"-"},"content":" PrefixPosition nextPrefixPosition) {","lastModifiedDate":"2016-10-16"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Prefix prefix \u003d currentPrefixPosition.getPrefix();","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" int valueStartPos \u003d currentPrefixPosition.getStartPosition() + prefix.getPrefix().length();","lastModifiedDate":"2016-10-16"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String value \u003d argsString.substring(valueStartPos, nextPrefixPosition.getStartPosition());","lastModifiedDate":"2016-10-16"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return value.trim();","lastModifiedDate":"2016-10-16"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":127,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":128,"author":{"gitId":"-"},"content":" * Represents a prefix\u0027s position in an arguments string.","lastModifiedDate":"2017-03-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":130,"author":{"gitId":"-"},"content":" private static class PrefixPosition {","lastModifiedDate":"2017-03-20"},{"lineNumber":131,"author":{"gitId":"-"},"content":" private int startPosition;","lastModifiedDate":"2016-10-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" private final Prefix prefix;","lastModifiedDate":"2016-10-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":134,"author":{"gitId":"-"},"content":" PrefixPosition(Prefix prefix, int startPosition) {","lastModifiedDate":"2016-10-19"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.prefix \u003d prefix;","lastModifiedDate":"2016-10-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" this.startPosition \u003d startPosition;","lastModifiedDate":"2016-10-19"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" int getStartPosition() {","lastModifiedDate":"2016-10-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return startPosition;","lastModifiedDate":"2018-08-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" Prefix getPrefix() {","lastModifiedDate":"2016-10-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return prefix;","lastModifiedDate":"2018-08-14"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-16"}],"authorContributionMap":{"Wyrkx":1,"-":147}},{"path":"src/main/java/tutorpro/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"Wyrkx":1,"-":14}},{"path":"src/main/java/tutorpro/logic/parser/DeleteCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new DeleteCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class DeleteCommandParser implements Parser\u003cDeleteCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the DeleteCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * and returns a DeleteCommand object for execution.","lastModifiedDate":"2019-05-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public DeleteCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2017-05-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new DeleteCommand(index);","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"Wyrkx":5,"-":24}},{"path":"src/main/java/tutorpro/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor editPersonDescriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2017-06-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"Wyrkx":12,"-":72}},{"path":"src/main/java/tutorpro/logic/parser/FindCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new FindCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParser implements Parser\u003cFindCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the FindCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * and returns a FindCommand object for execution.","lastModifiedDate":"2019-05-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public FindCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" String trimmedArgs \u003d args.trim();","lastModifiedDate":"2017-02-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" if (trimmedArgs.isEmpty()) {","lastModifiedDate":"2017-02-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-01-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" String[] nameKeywords \u003d trimmedArgs.split(\"\\\\s+\");","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(nameKeywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"Wyrkx":5,"-":28}},{"path":"src/main/java/tutorpro/logic/parser/Parser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Parser that is able to parse user input into a {@code Command} of type {@code T}.","lastModifiedDate":"2017-07-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public interface Parser\u003cT extends Command\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a command and returns it.","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * @throws ParseException if {@code userInput} does not conform the expected format","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" T parse(String userInput) throws ParseException;","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"Wyrkx":3,"-":13}},{"path":"src/main/java/tutorpro/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":33,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":48,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":61,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":76,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":86,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":91,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":106,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":108,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":117,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":118,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":120,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"Wyrkx":9,"-":115}},{"path":"src/main/java/tutorpro/logic/parser/Prefix.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * A prefix that marks the beginning of an argument in an arguments string.","lastModifiedDate":"2017-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" * E.g. \u0027t/\u0027 in \u0027add James t/ friend\u0027.","lastModifiedDate":"2017-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class Prefix {","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" private final String prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public Prefix(String prefix) {","lastModifiedDate":"2017-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" this.prefix \u003d prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public String getPrefix() {","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" return prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return getPrefix();","lastModifiedDate":"2017-05-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return prefix \u003d\u003d null ? 0 : prefix.hashCode();","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" if (!(other instanceof Prefix)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Prefix otherPrefix \u003d (Prefix) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return prefix.equals(otherPrefix.prefix);","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-11"}],"authorContributionMap":{"Wyrkx":1,"-":41}},{"path":"src/main/java/tutorpro/logic/parser/exceptions/ParseException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Represents a parse error encountered by a parser.","lastModifiedDate":"2017-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class ParseException extends IllegalValueException {","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public ParseException(String message) {","lastModifiedDate":"2017-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2017-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public ParseException(String message, Throwable cause) {","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-11"}],"authorContributionMap":{"Wyrkx":2,"-":15}},{"path":"src/main/java/tutorpro/model/AddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.UniquePersonList;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Wraps all data at the address-book level","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Duplicates are not allowed (by .isSamePerson comparison)","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class AddressBook implements ReadOnlyAddressBook {","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final UniquePersonList persons;","lastModifiedDate":"2016-08-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * The \u0027unusual\u0027 code block below is a non-static initialization block, sometimes used to avoid duplication","lastModifiedDate":"2019-05-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * between constructors. See https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html","lastModifiedDate":"2016-10-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Note that non-static init blocks are not recommended to use. There are other ways to avoid duplication","lastModifiedDate":"2016-10-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * among constructors.","lastModifiedDate":"2016-10-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" {","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" persons \u003d new UniquePersonList();","lastModifiedDate":"2016-08-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddressBook() {}","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Creates an AddressBook using the Persons in the {@code toBeCopied}","lastModifiedDate":"2018-03-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public AddressBook(ReadOnlyAddressBook toBeCopied) {","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this();","lastModifiedDate":"2016-12-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" resetData(toBeCopied);","lastModifiedDate":"2016-12-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" //// list overwrite operations","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Replaces the contents of the person list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.persons.setPersons(persons);","lastModifiedDate":"2016-10-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Resets the existing data of this {@code AddressBook} with {@code newData}.","lastModifiedDate":"2017-08-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void resetData(ReadOnlyAddressBook newData) {","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" requireNonNull(newData);","lastModifiedDate":"2017-05-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" setPersons(newData.getPersonList());","lastModifiedDate":"2018-03-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" //// person-level operations","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns true if a person with the same identity as {@code person} exists in the address book.","lastModifiedDate":"2018-08-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return persons.contains(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * The person must not already exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void addPerson(Person p) {","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" persons.add(p);","lastModifiedDate":"2018-03-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Replaces the given person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2018-01-10"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * {@code target} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":84,"author":{"gitId":"-"},"content":" requireNonNull(editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" persons.setPerson(target, editedPerson);","lastModifiedDate":"2018-03-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Removes {@code key} from this {@code AddressBook}.","lastModifiedDate":"2017-08-16"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * {@code key} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void removePerson(Person key) {","lastModifiedDate":"2018-08-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":" persons.remove(key);","lastModifiedDate":"2018-02-28"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" //// util methods","lastModifiedDate":"2016-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .add(\"persons\", persons)","lastModifiedDate":"2019-02-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" return persons.asUnmodifiableObservableList();","lastModifiedDate":"2018-04-05"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-01"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-01"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" if (!(other instanceof AddressBook)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" AddressBook otherAddressBook \u003d (AddressBook) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" return persons.equals(otherAddressBook.persons);","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return persons.hashCode();","lastModifiedDate":"2018-03-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":4,"-":126}},{"path":"src/main/java/tutorpro/model/Model.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * The API of the Model component.","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public interface Model {","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /** {@code Predicate} that always evaluate to true */","lastModifiedDate":"2017-08-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":" Predicate\u003cPerson\u003e PREDICATE_SHOW_ALL_PERSONS \u003d unused -\u003e true;","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Replaces user prefs data with the data in {@code userPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" void setUserPrefs(ReadOnlyUserPrefs userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns the user prefs.","lastModifiedDate":"2018-11-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ReadOnlyUserPrefs getUserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Sets the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" void setGuiSettings(GuiSettings guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Sets the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" void setAddressBookFilePath(Path addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Replaces address book data with the data in {@code addressBook}.","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" void setAddressBook(ReadOnlyAddressBook addressBook);","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /** Returns the AddressBook */","lastModifiedDate":"2016-09-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook getAddressBook();","lastModifiedDate":"2016-09-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Returns true if a person with the same identity as {@code person} exists in the address book.","lastModifiedDate":"2018-08-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" boolean hasPerson(Person person);","lastModifiedDate":"2018-08-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Deletes the given person.","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * The person must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" void deletePerson(Person target);","lastModifiedDate":"2018-08-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Adds the given person.","lastModifiedDate":"2018-08-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * {@code person} must not already exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" void addPerson(Person person);","lastModifiedDate":"2018-08-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Replaces the given person {@code target} with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * {@code target} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" void setPerson(Person target, Person editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /** Returns an unmodifiable view of the filtered person list */","lastModifiedDate":"2017-09-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getFilteredPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Updates the filter of the filtered person list to filter by the given {@code predicate}.","lastModifiedDate":"2017-08-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code predicate} is null.","lastModifiedDate":"2017-08-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate);","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"Wyrkx":3,"-":84}},{"path":"src/main/java/tutorpro/model/ModelManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-08-05"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import javafx.collections.transformation.FilteredList;","lastModifiedDate":"2016-08-26"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Represents the in-memory model of the address book data.","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ModelManager implements Model {","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(ModelManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final AddressBook addressBook;","lastModifiedDate":"2019-01-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final UserPrefs userPrefs;","lastModifiedDate":"2018-12-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private final FilteredList\u003cPerson\u003e filteredPersons;","lastModifiedDate":"2018-01-10"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Initializes a ModelManager with the given addressBook and userPrefs.","lastModifiedDate":"2016-12-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(addressBook, userPrefs);","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" logger.fine(\"Initializing with address book: \" + addressBook + \" and user prefs \" + userPrefs);","lastModifiedDate":"2016-12-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.addressBook \u003d new AddressBook(addressBook);","lastModifiedDate":"2019-01-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.userPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" filteredPersons \u003d new FilteredList\u003c\u003e(this.addressBook.getPersonList());","lastModifiedDate":"2019-01-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public ModelManager() {","lastModifiedDate":"2016-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this(new AddressBook(), new UserPrefs());","lastModifiedDate":"2016-09-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d UserPrefs \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":" requireNonNull(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" this.userPrefs.resetData(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return userPrefs;","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return userPrefs.getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" requireNonNull(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return userPrefs.getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" requireNonNull(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AddressBook \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2018-11-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook addressBook) {","lastModifiedDate":"2018-11-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":" this.addressBook.resetData(addressBook);","lastModifiedDate":"2019-01-25"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2019-01-25"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return addressBook.hasPerson(person);","lastModifiedDate":"2019-01-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" addressBook.removePerson(target);","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2019-01-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-26"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-26"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":110,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(target, editedPerson);","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" addressBook.setPerson(target, editedPerson);","lastModifiedDate":"2019-01-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Filtered Person List Accessors \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-10-12"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-19"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Returns an unmodifiable view of the list of {@code Person} backed by the internal list of","lastModifiedDate":"2018-01-10"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * {@code versionedAddressBook}","lastModifiedDate":"2018-06-11"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-19"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":123,"author":{"gitId":"-"},"content":" return filteredPersons;","lastModifiedDate":"2018-12-09"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":128,"author":{"gitId":"-"},"content":" requireNonNull(predicate);","lastModifiedDate":"2017-08-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":" filteredPersons.setPredicate(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" if (!(other instanceof ModelManager)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":" ModelManager otherModelManager \u003d (ModelManager) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return addressBook.equals(otherModelManager.addressBook)","lastModifiedDate":"2023-07-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" \u0026\u0026 userPrefs.equals(otherModelManager.userPrefs)","lastModifiedDate":"2023-07-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" \u0026\u0026 filteredPersons.equals(otherModelManager.filteredPersons);","lastModifiedDate":"2023-07-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":8,"-":141}},{"path":"src/main/java/tutorpro/model/ReadOnlyAddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Unmodifiable view of an address book","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public interface ReadOnlyAddressBook {","lastModifiedDate":"2019-01-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Returns an unmodifiable view of the persons list.","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * This list will not contain any duplicate persons.","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":15}},{"path":"src/main/java/tutorpro/model/ReadOnlyUserPrefs.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-11-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Unmodifiable view of user prefs.","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public interface ReadOnlyUserPrefs {","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-11-27"}],"authorContributionMap":{"Wyrkx":2,"-":14}},{"path":"src/main/java/tutorpro/model/UserPrefs.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Represents User\u0027s preferences.","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class UserPrefs implements ReadOnlyUserPrefs {","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private GuiSettings guiSettings \u003d new GuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private Path addressBookFilePath \u003d Paths.get(\"data\" , \"addressbook.json\");","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with default values.","lastModifiedDate":"2018-12-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public UserPrefs() {}","lastModifiedDate":"2018-12-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with the prefs in {@code userPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public UserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this();","lastModifiedDate":"2018-12-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" resetData(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Resets the existing data of this {@code UserPrefs} with {@code newUserPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData(ReadOnlyUserPrefs newUserPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(newUserPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" setGuiSettings(newUserPrefs.getGuiSettings());","lastModifiedDate":"2018-12-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" setAddressBookFilePath(newUserPrefs.getAddressBookFilePath());","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return guiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.guiSettings \u003d guiSettings;","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" requireNonNull(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.addressBookFilePath \u003d addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" if (!(other instanceof UserPrefs)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" UserPrefs otherUserPrefs \u003d (UserPrefs) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return guiSettings.equals(otherUserPrefs.guiSettings)","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u0026\u0026 addressBookFilePath.equals(otherUserPrefs.addressBookFilePath);","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Objects.hash(guiSettings, addressBookFilePath);","lastModifiedDate":"2018-08-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-02-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" sb.append(\"Gui Settings : \" + guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" sb.append(\"\\nLocal data file location : \" + addressBookFilePath);","lastModifiedDate":"2017-02-25"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":86}},{"path":"src/main/java/tutorpro/model/person/Address.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s address in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Address {","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Addresses can take any values, and it should not be blank\";","lastModifiedDate":"2018-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Constructs an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @param address A valid address.","lastModifiedDate":"2017-05-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Address(String address) {","lastModifiedDate":"2017-05-30"},{"lineNumber":30,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" value \u003d address;","lastModifiedDate":"2018-08-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static boolean isValidAddress(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (!(other instanceof Address)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Address otherAddress \u003d (Address) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return value.equals(otherAddress.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":5,"-":62}},{"path":"src/main/java/tutorpro/model/person/Email.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s email in the address book.","lastModifiedDate":"2018-02-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Email {","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2021-07-20"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2018-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2018-02-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2021-07-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"characters.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"2. This is followed by a \u0027@\u0027 and then a domain name. The domain name is made up of domain labels \"","lastModifiedDate":"2021-07-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2021-07-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // alphanumeric and special characters","lastModifiedDate":"2018-02-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2021-07-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2021-07-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2021-07-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String DOMAIN_LAST_PART_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"){2,}$\"; // At least two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Constructs an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":40,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * @param email A valid email address.","lastModifiedDate":"2017-05-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public Email(String email) {","lastModifiedDate":"2017-05-30"},{"lineNumber":44,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-15"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidEmail(email), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" value \u003d email;","lastModifiedDate":"2018-08-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static boolean isValidEmail(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" if (!(other instanceof Email)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" Email otherEmail \u003d (Email) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return value.equals(otherEmail.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":5,"-":76}},{"path":"src/main/java/tutorpro/model/person/Name.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s name in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Name {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2018-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2018-04-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public final String fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code Name}.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @param name A valid name.","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Name(String name) {","lastModifiedDate":"2017-05-30"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidName(name), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" fullName \u003d name;","lastModifiedDate":"2018-08-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid name.","lastModifiedDate":"2018-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static boolean isValidName(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (!(other instanceof Name)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Name otherName \u003d (Name) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return fullName.equals(otherName.fullName);","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return fullName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":5,"-":64}},{"path":"src/main/java/tutorpro/model/person/NameContainsKeywordsPredicate.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Tests that a {@code Person}\u0027s {@code Name} matches any of the keywords given.","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicate implements Predicate\u003cPerson\u003e {","lastModifiedDate":"2018-01-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final List\u003cString\u003e keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public NameContainsKeywordsPredicate(List\u003cString\u003e keywords) {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" this.keywords \u003d keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public boolean test(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return keywords.stream()","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" .anyMatch(keyword -\u003e StringUtil.containsWordIgnoreCase(person.getName().fullName, keyword));","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!(other instanceof NameContainsKeywordsPredicate)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate otherNameContainsKeywordsPredicate \u003d (NameContainsKeywordsPredicate) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return keywords.equals(otherNameContainsKeywordsPredicate.keywords);","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"keywords\", keywords).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"Wyrkx":3,"-":41}},{"path":"src/main/java/tutorpro/model/person/Person.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public Person(Name name, Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-03-14"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":6,"-":112}},{"path":"src/main/java/tutorpro/model/person/Phone.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s phone number in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Phone {","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2018-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"Phone numbers should only contain numbers, and it should be at least 3 digits long\";","lastModifiedDate":"2018-04-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\d{3,}\";","lastModifiedDate":"2018-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Constructs a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param phone A valid phone number.","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Phone(String phone) {","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidPhone(phone), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" value \u003d phone;","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid phone number.","lastModifiedDate":"2018-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static boolean isValidPhone(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!(other instanceof Phone)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Phone otherPhone \u003d (Phone) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return value.equals(otherPhone.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":5,"-":58}},{"path":"src/main/java/tutorpro/model/person/UniquePersonList.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Iterator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A list of persons that enforces uniqueness between its elements and does not allow nulls.","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A person is considered unique by comparing using {@code Person#isSamePerson(Person)}. As such, adding and updating of","lastModifiedDate":"2018-04-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * persons uses Person#isSamePerson(Person) for equality so as to ensure that the person being added or updated is","lastModifiedDate":"2018-04-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * unique in terms of identity in the UniquePersonList. However, the removal of a person uses Person#equals(Object) so","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * as to ensure that the person with exactly the same fields will be removed.","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Supports a minimal set of list operations.","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see Person#isSamePerson(Person)","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class UniquePersonList implements Iterable\u003cPerson\u003e {","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalList \u003d FXCollections.observableArrayList();","lastModifiedDate":"2016-10-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalUnmodifiableList \u003d","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":" FXCollections.unmodifiableObservableList(internalList);","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Returns true if the list contains an equivalent person as the given argument.","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public boolean contains(Person toCheck) {","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(toCheck);","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return internalList.stream().anyMatch(toCheck::isSamePerson);","lastModifiedDate":"2018-04-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Adds a person to the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * The person must not already exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void add(Person toAdd) {","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(toAdd);","lastModifiedDate":"2017-05-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" if (contains(toAdd)) {","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" internalList.add(toAdd);","lastModifiedDate":"2018-01-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Replaces the person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * {@code target} must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(target, editedPerson);","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" int index \u003d internalList.indexOf(target);","lastModifiedDate":"2017-06-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (index \u003d\u003d -1) {","lastModifiedDate":"2017-06-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2017-06-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (!target.isSamePerson(editedPerson) \u0026\u0026 contains(editedPerson)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-12-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" internalList.set(index, editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Removes the equivalent person from the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * The person must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void remove(Person toRemove) {","lastModifiedDate":"2018-08-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" requireNonNull(toRemove);","lastModifiedDate":"2017-05-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (!internalList.remove(toRemove)) {","lastModifiedDate":"2018-02-28"},{"lineNumber":79,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2016-08-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void setPersons(UniquePersonList replacement) {","lastModifiedDate":"2016-10-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" requireNonNull(replacement);","lastModifiedDate":"2018-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" internalList.setAll(replacement.internalList);","lastModifiedDate":"2018-08-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Replaces the contents of this list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(persons);","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (!personsAreUnique(persons)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2018-01-21"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" internalList.setAll(persons);","lastModifiedDate":"2018-08-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-09-01"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Returns the backing list as an unmodifiable {@code ObservableList}.","lastModifiedDate":"2017-09-01"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-09-01"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e asUnmodifiableObservableList() {","lastModifiedDate":"2018-04-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return internalUnmodifiableList;","lastModifiedDate":"2018-12-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public Iterator\u003cPerson\u003e iterator() {","lastModifiedDate":"2016-08-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return internalList.iterator();","lastModifiedDate":"2016-08-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":115,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" if (!(other instanceof UniquePersonList)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" UniquePersonList otherUniquePersonList \u003d (UniquePersonList) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return internalList.equals(otherUniquePersonList.internalList);","lastModifiedDate":"2023-07-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":" return internalList.hashCode();","lastModifiedDate":"2016-09-21"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-24"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return internalList.toString();","lastModifiedDate":"2019-02-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":138,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * Returns true if {@code persons} contains only unique persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":141,"author":{"gitId":"-"},"content":" private boolean personsAreUnique(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-04-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c persons.size() - 1; i++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" for (int j \u003d i + 1; j \u003c persons.size(); j++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" if (persons.get(i).isSamePerson(persons.get(j))) {","lastModifiedDate":"2018-04-19"},{"lineNumber":145,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":149,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":151,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":7,"-":144}},{"path":"src/main/java/tutorpro/model/person/exceptions/DuplicatePersonException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that the operation will result in duplicate Persons (Persons are considered duplicates if they have the same","lastModifiedDate":"2018-04-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":" * identity).","lastModifiedDate":"2018-04-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class DuplicatePersonException extends RuntimeException {","lastModifiedDate":"2018-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" public DuplicatePersonException() {","lastModifiedDate":"2017-06-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" super(\"Operation would result in duplicate persons\");","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"Wyrkx":1,"-":10}},{"path":"src/main/java/tutorpro/model/person/exceptions/PersonNotFoundException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that the operation is unable to find the specified person.","lastModifiedDate":"2017-06-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class PersonNotFoundException extends RuntimeException {}","lastModifiedDate":"2018-08-07"}],"authorContributionMap":{"Wyrkx":1,"-":5}},{"path":"src/main/java/tutorpro/model/tag/Tag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Tag in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Tag {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Tags names should be alphanumeric\";","lastModifiedDate":"2018-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\p{Alnum}+\";","lastModifiedDate":"2018-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public final String tagName;","lastModifiedDate":"2016-10-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Constructs a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param tagName A valid tag name.","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Tag(String tagName) {","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(tagName);","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidTagName(tagName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2017-05-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid tag name.","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static boolean isValidTagName(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof Tag)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Tag otherTag \u003d (Tag) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return tagName.equals(otherTag.tagName);","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return tagName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Format state as text for viewing.","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return \u0027[\u0027 + tagName + \u0027]\u0027;","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":5,"-":59}},{"path":"src/main/java/tutorpro/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":40,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"Wyrkx":9,"-":51}},{"path":"src/main/java/tutorpro/storage/AddressBookStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" * Represents a storage for {@link AddressBook}.","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public interface AddressBookStorage {","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Returns the file path of the data file.","lastModifiedDate":"2016-09-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns AddressBook data as a {@link ReadOnlyAddressBook}.","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns {@code Optional.empty()} if storage file is not found.","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @see #getAddressBookFilePath()","lastModifiedDate":"2016-10-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Saves the given {@link ReadOnlyAddressBook} to the storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param addressBook cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @throws IOException if there was any problem writing to the file.","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;","lastModifiedDate":"2016-09-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @see #saveAddressBook(ReadOnlyAddressBook)","lastModifiedDate":"2016-10-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException;","lastModifiedDate":"2018-04-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":5,"-":41}},{"path":"src/main/java/tutorpro/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2023-05-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":8,"-":101}},{"path":"src/main/java/tutorpro/storage/JsonAdaptedTag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Tag}.","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"class JsonAdaptedTag {","lastModifiedDate":"2018-12-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final String tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedTag} with the given {@code tagName}.","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public JsonAdaptedTag(String tagName) {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Converts a given {@code Tag} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public JsonAdaptedTag(Tag source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" tagName \u003d source.tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @JsonValue","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public String getTagName() {","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted tag object into the model\u0027s {@code Tag} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted tag.","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Tag toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(tagName)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new Tag(tagName);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":3,"-":45}},{"path":"src/main/java/tutorpro/storage/JsonAddressBookStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.FileUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.JsonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A class to access AddressBook data stored as a json file on the hard disk.","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorage implements AddressBookStorage {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonAddressBookStorage.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Path filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public JsonAddressBookStorage(Path filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return readAddressBook(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Similar to {@link #readAddressBook()}.","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Optional\u003cJsonSerializableAddressBook\u003e jsonAddressBook \u003d JsonUtil.readJsonFile(","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" filePath, JsonSerializableAddressBook.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!jsonAddressBook.isPresent()) {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Optional.of(jsonAddressBook.get().toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" logger.info(\"Illegal values found in \" + filePath + \": \" + ive.getMessage());","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" throw new DataLoadingException(ive);","lastModifiedDate":"2023-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Similar to {@link #saveAddressBook(ReadOnlyAddressBook)}.","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" requireNonNull(addressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" FileUtil.createIfMissing(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(new JsonSerializableAddressBook(addressBook), filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":7,"-":73}},{"path":"src/main/java/tutorpro/storage/JsonSerializableAddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonRootName;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * An Immutable AddressBook that is serializable to JSON format.","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"@JsonRootName(value \u003d \"addressbook\")","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"class JsonSerializableAddressBook {","lastModifiedDate":"2018-12-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"Persons list contains duplicate person(s).\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedPerson\u003e persons \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonSerializableAddressBook} with the given persons.","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(@JsonProperty(\"persons\") List\u003cJsonAdaptedPerson\u003e persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.persons.addAll(persons);","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created {@code JsonSerializableAddressBook}.","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" persons.addAll(source.getPersonList().stream().map(JsonAdaptedPerson::new).collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Converts this address book into the model\u0027s {@code AddressBook} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated.","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public AddressBook toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" for (JsonAdaptedPerson jsonAdaptedPerson : persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Person person \u003d jsonAdaptedPerson.toModelType();","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (addressBook.hasPerson(person)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":5,"-":55}},{"path":"src/main/java/tutorpro/storage/JsonUserPrefsStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.JsonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * A class to access UserPrefs stored in the hard disk as a json file","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class JsonUserPrefsStorage implements UserPrefsStorage {","lastModifiedDate":"2016-10-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private Path filePath;","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public JsonUserPrefsStorage(Path filePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-02-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2017-02-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return readUserPrefs(filePath);","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Similar to {@link #readUserPrefs()}","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @param prefsFilePath location of the data. Cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if the file format is not as expected.","lastModifiedDate":"2023-06-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs(Path prefsFilePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return JsonUtil.readJsonFile(prefsFilePath, UserPrefs.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException {","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(userPrefs, filePath);","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":5,"-":42}},{"path":"src/main/java/tutorpro/storage/Storage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * API of the Storage component","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public interface Storage extends AddressBookStorage, UserPrefsStorage {","lastModifiedDate":"2016-09-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException;","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;","lastModifiedDate":"2016-09-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"Wyrkx":5,"-":27}},{"path":"src/main/java/tutorpro/storage/StorageManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Manages storage of AddressBook data in local storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class StorageManager implements Storage {","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(StorageManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private AddressBookStorage addressBookStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private UserPrefsStorage userPrefsStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates a {@code StorageManager} with the given {@code AddressBookStorage} and {@code UserPrefStorage}.","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public StorageManager(AddressBookStorage addressBookStorage, UserPrefsStorage userPrefsStorage) {","lastModifiedDate":"2016-10-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.addressBookStorage \u003d addressBookStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.userPrefsStorage \u003d userPrefsStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d UserPrefs methods \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-02-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return userPrefsStorage.getUserPrefsFilePath();","lastModifiedDate":"2017-02-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return userPrefsStorage.readUserPrefs();","lastModifiedDate":"2016-10-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException {","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" userPrefsStorage.saveUserPrefs(userPrefs);","lastModifiedDate":"2016-10-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AddressBook methods \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return addressBookStorage.getAddressBookFilePath();","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return readAddressBook(addressBookStorage.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-01"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" logger.fine(\"Attempting to read data from file: \" + filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return addressBookStorage.readAddressBook(filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, addressBookStorage.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-01"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" logger.fine(\"Attempting to write to data file: \" + filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":75,"author":{"gitId":"-"},"content":" addressBookStorage.saveAddressBook(addressBook, filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":6,"-":72}},{"path":"src/main/java/tutorpro/storage/UserPrefsStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" * Represents a storage for {@link UserPrefs}.","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public interface UserPrefsStorage {","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Returns the file path of the UserPrefs data file.","lastModifiedDate":"2017-02-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Path getUserPrefsFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns UserPrefs data from storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns {@code Optional.empty()} if storage file is not found.","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if the loading of data from preference file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" * Saves the given {@link ReadOnlyUserPrefs} to the storage.","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * @param userPrefs cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @throws IOException if there was any problem writing to the file.","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException;","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":6,"-":30}},{"path":"src/main/java/tutorpro/ui/CommandBox.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextField;","lastModifiedDate":"2016-09-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * The UI component that is responsible for receiving user command inputs.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class CommandBox extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String ERROR_STYLE_CLASS \u003d \"error\";","lastModifiedDate":"2017-02-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"CommandBox.fxml\";","lastModifiedDate":"2017-04-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final CommandExecutor commandExecutor;","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private TextField commandTextField;","lastModifiedDate":"2016-09-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Creates a {@code CommandBox} with the given {@code CommandExecutor}.","lastModifiedDate":"2020-05-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public CommandBox(CommandExecutor commandExecutor) {","lastModifiedDate":"2019-01-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.commandExecutor \u003d commandExecutor;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // calls #setStyleToDefault() whenever there is a change to the text of the command box.","lastModifiedDate":"2017-06-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" commandTextField.textProperty().addListener((unused1, unused2, unused3) -\u003e setStyleToDefault());","lastModifiedDate":"2017-06-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Handles the Enter button pressed event.","lastModifiedDate":"2017-08-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private void handleCommandEntered() {","lastModifiedDate":"2018-04-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":" String commandText \u003d commandTextField.getText();","lastModifiedDate":"2020-12-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":" if (commandText.equals(\"\")) {","lastModifiedDate":"2020-12-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2020-12-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-12-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-12-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-02-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" commandExecutor.execute(commandText);","lastModifiedDate":"2020-12-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":" commandTextField.setText(\"\");","lastModifiedDate":"2016-09-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" } catch (CommandException | ParseException e) {","lastModifiedDate":"2017-03-11"},{"lineNumber":49,"author":{"gitId":"-"},"content":" setStyleToIndicateCommandFailure();","lastModifiedDate":"2017-02-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Sets the command box style to use the default style.","lastModifiedDate":"2017-06-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private void setStyleToDefault() {","lastModifiedDate":"2017-06-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":" commandTextField.getStyleClass().remove(ERROR_STYLE_CLASS);","lastModifiedDate":"2017-02-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Sets the command box style to indicate a failed command.","lastModifiedDate":"2017-02-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":" private void setStyleToIndicateCommandFailure() {","lastModifiedDate":"2017-02-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" ObservableList\u003cString\u003e styleClass \u003d commandTextField.getStyleClass();","lastModifiedDate":"2017-03-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" if (styleClass.contains(ERROR_STYLE_CLASS)) {","lastModifiedDate":"2017-03-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2017-03-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" styleClass.add(ERROR_STYLE_CLASS);","lastModifiedDate":"2017-03-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Represents a function that can execute commands.","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @FunctionalInterface","lastModifiedDate":"2018-12-09"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public interface CommandExecutor {","lastModifiedDate":"2018-12-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2018-12-09"},{"lineNumber":80,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" * @see Logic#execute(String)","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":83,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-14"}],"authorContributionMap":{"Wyrkx":6,"-":80}},{"path":"src/main/java/tutorpro/ui/HelpWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-12-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Button;","lastModifiedDate":"2019-08-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2019-08-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.input.Clipboard;","lastModifiedDate":"2019-08-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.input.ClipboardContent;","lastModifiedDate":"2019-08-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Controller for a help page","lastModifiedDate":"2016-08-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class HelpWindow extends UiPart\u003cStage\u003e {","lastModifiedDate":"2017-12-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String USERGUIDE_URL \u003d \"https://se-education.org/addressbook-level3/UserGuide.html\";","lastModifiedDate":"2019-08-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String HELP_MESSAGE \u003d \"Refer to the user guide: \" + USERGUIDE_URL;","lastModifiedDate":"2019-08-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(HelpWindow.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"HelpWindow.fxml\";","lastModifiedDate":"2016-09-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Button copyButton;","lastModifiedDate":"2019-08-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-08-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2019-08-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Label helpMessage;","lastModifiedDate":"2019-08-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-12-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Creates a new HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-12-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @param root Stage to use as the root of the HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-12-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public HelpWindow(Stage root) {","lastModifiedDate":"2017-12-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":" super(FXML, root);","lastModifiedDate":"2017-12-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":" helpMessage.setText(HELP_MESSAGE);","lastModifiedDate":"2019-08-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-12-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Creates a new HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-12-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public HelpWindow() {","lastModifiedDate":"2017-12-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this(new Stage());","lastModifiedDate":"2017-12-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-01"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Shows the help window.","lastModifiedDate":"2017-08-16"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * @throws IllegalStateException","lastModifiedDate":"2017-08-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * \u003cul\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * if this method is called on a thread other than the JavaFX Application Thread.","lastModifiedDate":"2017-08-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * if this method is called during animation or layout processing.","lastModifiedDate":"2017-08-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * if this method is called on the primary stage.","lastModifiedDate":"2017-08-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * if {@code dialogStage} is already showing.","lastModifiedDate":"2017-08-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * \u003c/ul\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void show() {","lastModifiedDate":"2016-08-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.fine(\"Showing help page about the application.\");","lastModifiedDate":"2016-12-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" getRoot().show();","lastModifiedDate":"2018-02-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" getRoot().centerOnScreen();","lastModifiedDate":"2019-08-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-15"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Returns true if the help window is currently being shown.","lastModifiedDate":"2018-03-15"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-15"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public boolean isShowing() {","lastModifiedDate":"2018-03-15"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return getRoot().isShowing();","lastModifiedDate":"2018-03-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Hides the help window.","lastModifiedDate":"2018-12-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hide() {","lastModifiedDate":"2018-12-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" getRoot().hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Focuses on the help window.","lastModifiedDate":"2018-03-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void focus() {","lastModifiedDate":"2018-03-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" getRoot().requestFocus();","lastModifiedDate":"2018-03-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-08-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-08-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Copies the URL to the user guide to the clipboard.","lastModifiedDate":"2019-08-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-08-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2019-08-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private void copyUrl() {","lastModifiedDate":"2019-08-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" final Clipboard clipboard \u003d Clipboard.getSystemClipboard();","lastModifiedDate":"2019-08-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" final ClipboardContent url \u003d new ClipboardContent();","lastModifiedDate":"2019-08-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" url.putString(USERGUIDE_URL);","lastModifiedDate":"2019-08-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" clipboard.setContent(url);","lastModifiedDate":"2019-08-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-08-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":2,"-":100}},{"path":"src/main/java/tutorpro/ui/MainWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-06-16"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.event.ActionEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.MenuItem;","lastModifiedDate":"2016-08-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextInputControl;","lastModifiedDate":"2016-12-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyCombination;","lastModifiedDate":"2016-08-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import javafx.scene.layout.StackPane;","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * The Main Window. Provides the basic application layout containing","lastModifiedDate":"2016-08-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * a menu bar and space where other JavaFX elements can be placed.","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class MainWindow extends UiPart\u003cStage\u003e {","lastModifiedDate":"2017-11-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"MainWindow.fxml\";","lastModifiedDate":"2016-08-18"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(getClass());","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Stage primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // Independent Ui parts residing in this Ui container","lastModifiedDate":"2016-08-18"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private PersonListPanel personListPanel;","lastModifiedDate":"2016-08-18"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private ResultDisplay resultDisplay;","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private HelpWindow helpWindow;","lastModifiedDate":"2018-03-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private StackPane commandBoxPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private MenuItem helpMenuItem;","lastModifiedDate":"2016-08-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private StackPane personListPanelPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private StackPane resultDisplayPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private StackPane statusbarPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Creates a {@code MainWindow} with the given {@code Stage} and {@code Logic}.","lastModifiedDate":"2020-05-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public MainWindow(Stage primaryStage, Logic logic) {","lastModifiedDate":"2018-12-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" super(FXML, primaryStage);","lastModifiedDate":"2017-11-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // Set dependencies","lastModifiedDate":"2016-09-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.primaryStage \u003d primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.logic \u003d logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // Configure the UI","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" setWindowDefaultSize(logic.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" setAccelerators();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" helpWindow \u003d new HelpWindow();","lastModifiedDate":"2018-03-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public Stage getPrimaryStage() {","lastModifiedDate":"2016-12-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return primaryStage;","lastModifiedDate":"2016-12-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private void setAccelerators() {","lastModifiedDate":"2016-09-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" setAccelerator(helpMenuItem, KeyCombination.valueOf(\"F1\"));","lastModifiedDate":"2016-12-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-18"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * Sets the accelerator of a MenuItem.","lastModifiedDate":"2016-12-18"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @param keyCombination the KeyCombination value of the accelerator","lastModifiedDate":"2016-12-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private void setAccelerator(MenuItem menuItem, KeyCombination keyCombination) {","lastModifiedDate":"2016-12-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":" menuItem.setAccelerator(keyCombination);","lastModifiedDate":"2016-12-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-12-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * TODO: the code below can be removed once the bug reported here","lastModifiedDate":"2016-12-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * https://bugs.openjdk.java.net/browse/JDK-8131666","lastModifiedDate":"2016-12-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * is fixed in later version of SDK.","lastModifiedDate":"2016-12-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * According to the bug report, TextInputControl (TextField, TextArea) will","lastModifiedDate":"2016-12-18"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * consume function-key events. Because CommandBox contains a TextField, and","lastModifiedDate":"2016-12-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * ResultDisplay contains a TextArea, thus some accelerators (e.g F1) will","lastModifiedDate":"2016-12-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * not work when the focus is in them because the key event is consumed by","lastModifiedDate":"2016-12-18"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * the TextInputControl(s).","lastModifiedDate":"2016-12-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * For now, we add following event filter to capture such key events and open","lastModifiedDate":"2016-12-18"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * help window purposely so to support accelerators even when focus is","lastModifiedDate":"2016-12-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * in CommandBox or ResultDisplay.","lastModifiedDate":"2016-12-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" getRoot().addEventFilter(KeyEvent.KEY_PRESSED, event -\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (event.getTarget() instanceof TextInputControl \u0026\u0026 keyCombination.match(event)) {","lastModifiedDate":"2016-12-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" menuItem.getOnAction().handle(new ActionEvent());","lastModifiedDate":"2016-12-18"},{"lineNumber":104,"author":{"gitId":"-"},"content":" event.consume();","lastModifiedDate":"2016-12-18"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":106,"author":{"gitId":"-"},"content":" });","lastModifiedDate":"2016-12-18"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Fills up all the placeholders of this window.","lastModifiedDate":"2017-08-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" void fillInnerParts() {","lastModifiedDate":"2016-09-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" personListPanel \u003d new PersonListPanel(logic.getFilteredPersonList());","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" personListPanelPlaceholder.getChildren().add(personListPanel.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" resultDisplay \u003d new ResultDisplay();","lastModifiedDate":"2018-12-09"},{"lineNumber":117,"author":{"gitId":"-"},"content":" resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" StatusBarFooter statusBarFooter \u003d new StatusBarFooter(logic.getAddressBookFilePath());","lastModifiedDate":"2019-01-25"},{"lineNumber":120,"author":{"gitId":"-"},"content":" statusbarPlaceholder.getChildren().add(statusBarFooter.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" CommandBox commandBox \u003d new CommandBox(this::executeCommand);","lastModifiedDate":"2019-01-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" commandBoxPlaceholder.getChildren().add(commandBox.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":127,"author":{"gitId":"-"},"content":" * Sets the default size based on {@code guiSettings}.","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":129,"author":{"gitId":"-"},"content":" private void setWindowDefaultSize(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":130,"author":{"gitId":"-"},"content":" primaryStage.setHeight(guiSettings.getWindowHeight());","lastModifiedDate":"2018-11-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" primaryStage.setWidth(guiSettings.getWindowWidth());","lastModifiedDate":"2018-11-27"},{"lineNumber":132,"author":{"gitId":"-"},"content":" if (guiSettings.getWindowCoordinates() !\u003d null) {","lastModifiedDate":"2018-11-27"},{"lineNumber":133,"author":{"gitId":"-"},"content":" primaryStage.setX(guiSettings.getWindowCoordinates().getX());","lastModifiedDate":"2018-11-27"},{"lineNumber":134,"author":{"gitId":"-"},"content":" primaryStage.setY(guiSettings.getWindowCoordinates().getY());","lastModifiedDate":"2018-11-27"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":138,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * Opens the help window or focuses on it if it\u0027s already opened.","lastModifiedDate":"2018-03-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":142,"author":{"gitId":"-"},"content":" public void handleHelp() {","lastModifiedDate":"2016-08-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":" if (!helpWindow.isShowing()) {","lastModifiedDate":"2018-03-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" helpWindow.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" helpWindow.focus();","lastModifiedDate":"2018-03-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":150,"author":{"gitId":"-"},"content":" void show() {","lastModifiedDate":"2016-10-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" primaryStage.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":152,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":154,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":155,"author":{"gitId":"-"},"content":" * Closes the application.","lastModifiedDate":"2016-08-18"},{"lineNumber":156,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":157,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":158,"author":{"gitId":"-"},"content":" private void handleExit() {","lastModifiedDate":"2016-08-18"},{"lineNumber":159,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(primaryStage.getWidth(), primaryStage.getHeight(),","lastModifiedDate":"2018-12-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":" (int) primaryStage.getX(), (int) primaryStage.getY());","lastModifiedDate":"2018-12-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" logic.setGuiSettings(guiSettings);","lastModifiedDate":"2018-12-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" helpWindow.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":" primaryStage.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-25"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public PersonListPanel getPersonListPanel() {","lastModifiedDate":"2016-08-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return personListPanel;","lastModifiedDate":"2018-08-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-25"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":170,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2018-12-09"},{"lineNumber":172,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-09"},{"lineNumber":173,"author":{"gitId":"Wyrkx"},"content":" * @see Logic#execute(String)","lastModifiedDate":"2024-03-11"},{"lineNumber":174,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":" private CommandResult executeCommand(String commandText) throws CommandException, ParseException {","lastModifiedDate":"2018-12-09"},{"lineNumber":176,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-12-09"},{"lineNumber":177,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d logic.execute(commandText);","lastModifiedDate":"2018-12-09"},{"lineNumber":178,"author":{"gitId":"-"},"content":" logger.info(\"Result: \" + commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":179,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":181,"author":{"gitId":"-"},"content":" if (commandResult.isShowHelp()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":182,"author":{"gitId":"-"},"content":" handleHelp();","lastModifiedDate":"2018-12-09"},{"lineNumber":183,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":185,"author":{"gitId":"-"},"content":" if (commandResult.isExit()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":186,"author":{"gitId":"-"},"content":" handleExit();","lastModifiedDate":"2018-12-09"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":190,"author":{"gitId":"-"},"content":" } catch (CommandException | ParseException e) {","lastModifiedDate":"2018-12-09"},{"lineNumber":191,"author":{"gitId":"-"},"content":" logger.info(\"An error occurred while executing command: \" + commandText);","lastModifiedDate":"2023-06-13"},{"lineNumber":192,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(e.getMessage());","lastModifiedDate":"2018-12-09"},{"lineNumber":193,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2018-12-09"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":8,"-":188}},{"path":"src/main/java/tutorpro/ui/PersonCard.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Comparator;","lastModifiedDate":"2019-01-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-01-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.FlowPane;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2016-09-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see \u003ca href\u003d\"https://github.com/se-edu/addressbook-level4/issues/336\"\u003eThe issue on AddressBook level 4\u003c/a\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" name.setText(person.getName().fullName);","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" phone.setText(person.getPhone().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":53,"author":{"gitId":"-"},"content":" address.setText(person.getAddress().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" email.setText(person.getEmail().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .sorted(Comparator.comparing(tag -\u003e tag.tagName))","lastModifiedDate":"2019-01-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.tagName)));","lastModifiedDate":"2019-01-02"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"Wyrkx":2,"-":57}},{"path":"src/main/java/tutorpro/ui/PersonListPanel.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-25"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.ListCell;","lastModifiedDate":"2016-09-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.control.ListView;","lastModifiedDate":"2016-08-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Panel containing the list of persons.","lastModifiedDate":"2016-09-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonListPanel extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListPanel.fxml\";","lastModifiedDate":"2016-09-14"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(PersonListPanel.class);","lastModifiedDate":"2017-04-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private ListView\u003cPerson\u003e personListView;","lastModifiedDate":"2018-02-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates a {@code PersonListPanel} with the given {@code ObservableList}.","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public PersonListPanel(ObservableList\u003cPerson\u003e personList) {","lastModifiedDate":"2019-01-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" personListView.setItems(personList);","lastModifiedDate":"2018-02-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" personListView.setCellFactory(listView -\u003e new PersonListViewCell());","lastModifiedDate":"2016-08-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Custom {@code ListCell} that displays the graphics of a {@code Person} using a {@code PersonCard}.","lastModifiedDate":"2018-02-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" class PersonListViewCell extends ListCell\u003cPerson\u003e {","lastModifiedDate":"2018-02-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" protected void updateItem(Person person, boolean empty) {","lastModifiedDate":"2018-02-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" super.updateItem(person, empty);","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" if (empty || person \u003d\u003d null) {","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" setGraphic(null);","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" setText(null);","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" setGraphic(new PersonCard(person, getIndex() + 1).getRoot());","lastModifiedDate":"2018-02-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":3,"-":46}},{"path":"src/main/java/tutorpro/ui/ResultDisplay.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-12-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextArea;","lastModifiedDate":"2016-09-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * A ui for the status bar that is displayed at the header of the application.","lastModifiedDate":"2016-09-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class ResultDisplay extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"ResultDisplay.fxml\";","lastModifiedDate":"2016-09-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-10-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private TextArea resultDisplay;","lastModifiedDate":"2016-10-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public ResultDisplay() {","lastModifiedDate":"2017-06-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":1,"-":27}},{"path":"src/main/java/tutorpro/ui/StatusBarFooter.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2018-12-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * A ui for the status bar that is displayed at the footer of the application.","lastModifiedDate":"2016-09-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class StatusBarFooter extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"StatusBarFooter.fxml\";","lastModifiedDate":"2017-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private Label saveLocationStatus;","lastModifiedDate":"2018-12-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Creates a {@code StatusBarFooter} with the given {@code Path}.","lastModifiedDate":"2020-05-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public StatusBarFooter(Path saveLocation) {","lastModifiedDate":"2019-01-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2017-04-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" saveLocationStatus.setText(Paths.get(\".\").resolve(saveLocation).toString());","lastModifiedDate":"2018-12-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":27}},{"path":"src/main/java/tutorpro/ui/Ui.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-09-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * API of UI component","lastModifiedDate":"2016-09-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public interface Ui {","lastModifiedDate":"2016-09-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":" /** Starts the UI (and the App). */","lastModifiedDate":"2016-09-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":" void start(Stage primaryStage);","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"Wyrkx":1,"-":12}},{"path":"src/main/java/tutorpro/ui/UiManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.application.Platform;","lastModifiedDate":"2016-08-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Alert;","lastModifiedDate":"2016-08-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Alert.AlertType;","lastModifiedDate":"2016-08-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.image.Image;","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The manager of the UI component.","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class UiManager implements Ui {","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String ALERT_DIALOG_PANE_FIELD_ID \u003d \"alertDialogPane\";","lastModifiedDate":"2017-04-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(UiManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String ICON_APPLICATION \u003d \"/images/address_book_32.png\";","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private MainWindow mainWindow;","lastModifiedDate":"2016-08-18"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Creates a {@code UiManager} with the given {@code Logic}.","lastModifiedDate":"2020-05-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public UiManager(Logic logic) {","lastModifiedDate":"2018-12-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.logic \u003d logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void start(Stage primaryStage) {","lastModifiedDate":"2016-09-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" logger.info(\"Starting UI...\");","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":" //Set the application icon.","lastModifiedDate":"2016-08-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":" primaryStage.getIcons().add(getImage(ICON_APPLICATION));","lastModifiedDate":"2016-08-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":42,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-08-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":" mainWindow \u003d new MainWindow(primaryStage, logic);","lastModifiedDate":"2018-12-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" mainWindow.show(); //This should be called before creating other UI parts","lastModifiedDate":"2016-08-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" mainWindow.fillInnerParts();","lastModifiedDate":"2016-08-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" } catch (Throwable e) {","lastModifiedDate":"2016-08-18"},{"lineNumber":48,"author":{"gitId":"-"},"content":" logger.severe(StringUtil.getDetails(e));","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" showFatalErrorDialogAndShutdown(\"Fatal error during initializing\", e);","lastModifiedDate":"2016-08-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private Image getImage(String imagePath) {","lastModifiedDate":"2016-08-18"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new Image(MainApp.class.getResourceAsStream(imagePath));","lastModifiedDate":"2016-08-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" void showAlertDialogAndWait(Alert.AlertType type, String title, String headerText, String contentText) {","lastModifiedDate":"2016-09-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" showAlertDialogAndWait(mainWindow.getPrimaryStage(), type, title, headerText, contentText);","lastModifiedDate":"2016-08-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Shows an alert dialog on {@code owner} with the given parameters.","lastModifiedDate":"2017-08-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * This method only returns after the user has closed the alert dialog.","lastModifiedDate":"2017-08-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static void showAlertDialogAndWait(Stage owner, AlertType type, String title, String headerText,","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String contentText) {","lastModifiedDate":"2016-08-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" final Alert alert \u003d new Alert(type);","lastModifiedDate":"2016-08-18"},{"lineNumber":68,"author":{"gitId":"-"},"content":" alert.getDialogPane().getStylesheets().add(\"view/DarkTheme.css\");","lastModifiedDate":"2016-08-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" alert.initOwner(owner);","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" alert.setTitle(title);","lastModifiedDate":"2016-08-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" alert.setHeaderText(headerText);","lastModifiedDate":"2016-08-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":" alert.setContentText(contentText);","lastModifiedDate":"2016-08-18"},{"lineNumber":73,"author":{"gitId":"-"},"content":" alert.getDialogPane().setId(ALERT_DIALOG_PANE_FIELD_ID);","lastModifiedDate":"2016-10-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" alert.showAndWait();","lastModifiedDate":"2016-08-18"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Shows an error alert dialog with {@code title} and error message, {@code e},","lastModifiedDate":"2017-08-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * and exits the application after the user has closed the alert dialog.","lastModifiedDate":"2017-08-16"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private void showFatalErrorDialogAndShutdown(String title, Throwable e) {","lastModifiedDate":"2016-09-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" logger.severe(title + \" \" + e.getMessage() + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" showAlertDialogAndWait(Alert.AlertType.ERROR, title, e.getMessage(), e.toString());","lastModifiedDate":"2016-08-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Platform.exit();","lastModifiedDate":"2016-08-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" System.exit(1);","lastModifiedDate":"2016-08-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":5,"-":83}},{"path":"src/main/java/tutorpro/ui/UiPart.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-12-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.net.URL;","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.fxml.FXMLLoader;","lastModifiedDate":"2016-12-21"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Represents a distinct part of the UI. e.g. Windows, dialogs, panels, status bars, etc.","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It contains a scene graph with a root node of type {@code T}.","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public abstract class UiPart\u003cT\u003e {","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /** Resource folder where FXML files are stored. */","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String FXML_FILE_FOLDER \u003d \"/view/\";","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final FXMLLoader fxmlLoader \u003d new FXMLLoader();","lastModifiedDate":"2017-11-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file URL.","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * The FXML file must not specify the {@code fx:controller} attribute.","lastModifiedDate":"2016-12-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public UiPart(URL fxmlFileUrl) {","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" loadFxmlFile(fxmlFileUrl, null);","lastModifiedDate":"2017-11-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Constructs a UiPart using the specified FXML file within {@link #FXML_FILE_FOLDER}.","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @see #UiPart(URL)","lastModifiedDate":"2016-12-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public UiPart(String fxmlFileName) {","lastModifiedDate":"2016-12-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this(getFxmlFileUrl(fxmlFileName));","lastModifiedDate":"2017-11-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file URL and root object.","lastModifiedDate":"2017-11-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * The FXML file must not specify the {@code fx:controller} attribute.","lastModifiedDate":"2017-11-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public UiPart(URL fxmlFileUrl, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" loadFxmlFile(fxmlFileUrl, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file within {@link #FXML_FILE_FOLDER} and root object.","lastModifiedDate":"2017-11-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * @see #UiPart(URL, T)","lastModifiedDate":"2017-11-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public UiPart(String fxmlFileName, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this(getFxmlFileUrl(fxmlFileName), root);","lastModifiedDate":"2017-11-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Returns the root object of the scene graph of this UiPart.","lastModifiedDate":"2016-12-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public T getRoot() {","lastModifiedDate":"2016-12-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return fxmlLoader.getRoot();","lastModifiedDate":"2016-12-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Loads the object hierarchy from a FXML document.","lastModifiedDate":"2017-11-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @param location Location of the FXML document.","lastModifiedDate":"2017-11-29"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @param root Specifies the root of the object hierarchy.","lastModifiedDate":"2017-11-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private void loadFxmlFile(URL location, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":" requireNonNull(location);","lastModifiedDate":"2017-11-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":" fxmlLoader.setLocation(location);","lastModifiedDate":"2017-11-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":" fxmlLoader.setController(this);","lastModifiedDate":"2017-11-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" fxmlLoader.setRoot(root);","lastModifiedDate":"2017-11-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-11-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":" fxmlLoader.load();","lastModifiedDate":"2017-11-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2017-11-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new AssertionError(e);","lastModifiedDate":"2017-11-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Returns the FXML file URL for the specified FXML file name within {@link #FXML_FILE_FOLDER}.","lastModifiedDate":"2017-11-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static URL getFxmlFileUrl(String fxmlFileName) {","lastModifiedDate":"2017-11-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" requireNonNull(fxmlFileName);","lastModifiedDate":"2017-11-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":" String fxmlFileNameWithFolder \u003d FXML_FILE_FOLDER + fxmlFileName;","lastModifiedDate":"2017-11-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":" URL fxmlFileUrl \u003d MainApp.class.getResource(fxmlFileNameWithFolder);","lastModifiedDate":"2017-11-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return requireNonNull(fxmlFileUrl);","lastModifiedDate":"2017-11-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":2,"-":86}},{"path":"src/test/java/tutorpro/AppParametersTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-04-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2018-04-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class AppParametersTest {","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private final ParametersStub parametersStub \u003d new ParametersStub();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final AppParameters expected \u003d new AppParameters();","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void parse_validConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", \"config.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" expected.setConfigPath(Paths.get(\"config.json\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void parse_nullConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", null);","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void parse_invalidConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", \"a\\0\");","lastModifiedDate":"2018-04-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expected.setConfigPath(null);","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String expected \u003d AppParameters.class.getCanonicalName() + \"{configPath\u003d\" + appParameters.getConfigPath() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertEquals(expected, appParameters.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertTrue(appParameters.equals(new AppParameters()));","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertTrue(appParameters.equals(appParameters));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // different config path -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" AppParameters otherAppParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" otherAppParameters.setConfigPath(Paths.get(\"configPath\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(otherAppParameters));","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private static class ParametersStub extends Application.Parameters {","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private Map\u003cString, String\u003e namedParameters \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2018-04-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getRaw() {","lastModifiedDate":"2018-04-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" throw new AssertionError(\"should not be called\");","lastModifiedDate":"2018-04-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getUnnamed() {","lastModifiedDate":"2018-04-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new AssertionError(\"should not be called\");","lastModifiedDate":"2018-04-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public Map\u003cString, String\u003e getNamed() {","lastModifiedDate":"2018-04-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return Collections.unmodifiableMap(namedParameters);","lastModifiedDate":"2018-04-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-04-21"}],"authorContributionMap":{"Wyrkx":1,"-":88}},{"path":"src/test/java/tutorpro/commons/core/ConfigTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class ConfigTest {","lastModifiedDate":"2016-09-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" Config config \u003d new Config();","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" String expected \u003d Config.class.getCanonicalName() + \"{logLevel\u003d\" + config.getLogLevel()","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \", userPrefsFilePath\u003d\" + config.getUserPrefsFilePath() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" assertEquals(expected, config.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public void equalsMethod() {","lastModifiedDate":"2016-09-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Config defaultConfig \u003d new Config();","lastModifiedDate":"2016-09-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertNotNull(defaultConfig);","lastModifiedDate":"2016-10-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertTrue(defaultConfig.equals(defaultConfig));","lastModifiedDate":"2016-09-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-30"}],"authorContributionMap":{"Wyrkx":1,"-":26}},{"path":"src/test/java/tutorpro/commons/core/GuiSettingsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class GuiSettingsTest {","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings();","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" String expected \u003d GuiSettings.class.getCanonicalName() + \"{windowWidth\u003d\" + guiSettings.getWindowWidth()","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" + \", windowHeight\u003d\" + guiSettings.getWindowHeight() + \", windowCoordinates\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + guiSettings.getWindowCoordinates() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertEquals(expected, guiSettings.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-23"}],"authorContributionMap":{"Wyrkx":1,"-":15}},{"path":"src/test/java/tutorpro/commons/core/VersionTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class VersionTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void versionParsing_acceptableVersionString_parsedVersionCorrectly() {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V0.0.0ea\", 0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V3.10.2\", 3, 10, 2, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V100.100.100ea\", 100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public void versionParsing_wrongVersionString_throwIllegalArgumentException() {","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e Version.fromString(\"This is not a version string\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void versionConstructor_correctParameter_valueAsExpected() {","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Version version \u003d new Version(19, 10, 20, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertEquals(19, version.getMajor());","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(10, version.getMinor());","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertEquals(20, version.getPatch());","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertEquals(true, version.isEarlyAccess());","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void versionToString_validVersion_correctStringRepresentation() {","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // boundary at 0","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Version version \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertEquals(\"V0.0.0ea\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // normal values","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" version \u003d new Version(4, 10, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertEquals(\"V4.10.5\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // big numbers","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" version \u003d new Version(100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertEquals(\"V100.100.100ea\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_compareToIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Version one;","lastModifiedDate":"2017-09-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Version another;","lastModifiedDate":"2017-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // Tests equality","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003d\u003d 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" one \u003d new Version(11, 12, 13, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" another \u003d new Version(11, 12, 13, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003d\u003d 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // Tests different patch","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Tests different minor","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 5, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // Tests different major","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":" one \u003d new Version(10, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" // Tests high major vs low minor","lastModifiedDate":"2016-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" one \u003d new Version(10, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 1, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // Tests high patch vs low minor","lastModifiedDate":"2016-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 10, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 1, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // Tests same major minor different patch","lastModifiedDate":"2016-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // Tests early access vs not early access on same version number","lastModifiedDate":"2016-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" // Tests early access lower version vs not early access higher version compare by version number first","lastModifiedDate":"2016-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // Tests early access higher version vs not early access lower version compare by version number first","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_hashCodeIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Version version \u003d new Version(100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertEquals(100100100, version.hashCode());","lastModifiedDate":"2016-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" version \u003d new Version(10, 10, 10, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertEquals(1010010010, version.hashCode());","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_equalIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Version one;","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" Version another;","lastModifiedDate":"2016-10-16"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertTrue(one.equals(another));","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" one \u003d new Version(100, 191, 275, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" another \u003d new Version(100, 191, 275, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertTrue(one.equals(another));","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" private void verifyVersionParsedCorrectly(String versionString,","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" int major, int minor, int patch, boolean isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertEquals(new Version(major, minor, patch, isEarlyAccess), Version.fromString(versionString));","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":136,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":4,"-":132}},{"path":"src/test/java/tutorpro/commons/core/index/IndexTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core.index;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class IndexTest {","lastModifiedDate":"2017-05-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public void createOneBasedIndex() {","lastModifiedDate":"2017-05-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" // invalid index","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IndexOutOfBoundsException.class, () -\u003e Index.fromOneBased(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // check equality using the same base","lastModifiedDate":"2017-05-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertEquals(1, Index.fromOneBased(1).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertEquals(5, Index.fromOneBased(5).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // convert from one-based index to zero-based index","lastModifiedDate":"2017-05-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertEquals(0, Index.fromOneBased(1).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertEquals(4, Index.fromOneBased(5).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void createZeroBasedIndex() {","lastModifiedDate":"2017-05-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // invalid index","lastModifiedDate":"2017-05-24"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IndexOutOfBoundsException.class, () -\u003e Index.fromZeroBased(-1));","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // check equality using the same base","lastModifiedDate":"2017-05-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertEquals(0, Index.fromZeroBased(0).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertEquals(5, Index.fromZeroBased(5).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // convert from zero-based index to one-based index","lastModifiedDate":"2017-05-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(1, Index.fromZeroBased(0).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertEquals(6, Index.fromZeroBased(5).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-05-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" final Index fifthPersonIndex \u003d Index.fromOneBased(5);","lastModifiedDate":"2017-05-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(Index.fromOneBased(5)));","lastModifiedDate":"2017-05-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(Index.fromZeroBased(4)));","lastModifiedDate":"2017-05-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(fifthPersonIndex));","lastModifiedDate":"2017-05-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(null));","lastModifiedDate":"2017-05-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(5.0f));","lastModifiedDate":"2017-05-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(Index.fromOneBased(1)));","lastModifiedDate":"2017-05-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromZeroBased(0);","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" String expected \u003d Index.class.getCanonicalName() + \"{zeroBasedIndex\u003d\" + index.getZeroBased() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertEquals(expected, index.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"Wyrkx":5,"-":63}},{"path":"src/test/java/tutorpro/commons/util/AppUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class AppUtilTest {","lastModifiedDate":"2016-09-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void getImage_exitingImage() {","lastModifiedDate":"2016-09-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":" assertNotNull(AppUtil.getImage(\"/images/address_book_32.png\"));","lastModifiedDate":"2016-09-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void getImage_nullGiven_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e AppUtil.getImage(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void checkArgument_true_nothingHappens() {","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" AppUtil.checkArgument(true);","lastModifiedDate":"2017-05-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" AppUtil.checkArgument(true, \"\");","lastModifiedDate":"2017-05-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void checkArgument_falseWithoutErrorMessage_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e AppUtil.checkArgument(false));","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void checkArgument_falseWithErrorMessage_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String errorMessage \u003d \"error message\";","lastModifiedDate":"2017-05-15"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, errorMessage, () -\u003e AppUtil.checkArgument(false, errorMessage));","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-30"}],"authorContributionMap":{"Wyrkx":6,"-":31}},{"path":"src/test/java/tutorpro/commons/util/CollectionUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2016-12-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-14"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class CollectionUtilTest {","lastModifiedDate":"2016-12-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void requireAllNonNullVarargs() {","lastModifiedDate":"2017-05-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // no arguments","lastModifiedDate":"2017-01-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown();","lastModifiedDate":"2017-05-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // any non-empty argument list","lastModifiedDate":"2017-01-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(new Object(), new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(\"test\");","lastModifiedDate":"2017-05-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(\"\");","lastModifiedDate":"2017-05-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // argument lists with just one null at the beginning","lastModifiedDate":"2017-01-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Object) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(null, \"\", new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(null, new Object(), new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // argument lists with nulls in the middle","lastModifiedDate":"2017-01-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(new Object(), null, null, \"test\");","lastModifiedDate":"2017-05-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(\"\", null, new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // argument lists with one null as the last argument","lastModifiedDate":"2017-01-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(\"\", new Object(), null);","lastModifiedDate":"2017-05-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(new Object(), new Object(), null);","lastModifiedDate":"2017-05-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // null reference","lastModifiedDate":"2017-05-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Object[]) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // confirms nulls inside lists in the argument list are not considered","lastModifiedDate":"2017-01-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" List\u003cObject\u003e containingNull \u003d Arrays.asList((Object) null);","lastModifiedDate":"2017-01-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(containingNull, new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-14"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void requireAllNonNullCollection() {","lastModifiedDate":"2017-05-19"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // lists containing nulls in the front","lastModifiedDate":"2017-01-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList((Object) null));","lastModifiedDate":"2017-05-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(null, new Object(), \"\"));","lastModifiedDate":"2017-05-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // lists containing nulls in the middle","lastModifiedDate":"2017-01-14"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", null, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", null, \"eggs\", null, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // lists containing nulls at the end","lastModifiedDate":"2017-01-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", new Object(), null));","lastModifiedDate":"2017-05-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(new Object(), null));","lastModifiedDate":"2017-05-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // null reference","lastModifiedDate":"2017-05-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Collection\u003cObject\u003e) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // empty list","lastModifiedDate":"2017-01-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Collections.emptyList());","lastModifiedDate":"2017-05-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // list with all non-null elements","lastModifiedDate":"2017-01-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(new Object(), \"ham\", Integer.valueOf(1)));","lastModifiedDate":"2018-04-01"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // confirms nulls inside nested lists are not considered","lastModifiedDate":"2017-01-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" List\u003cObject\u003e containingNull \u003d Arrays.asList((Object) null);","lastModifiedDate":"2017-01-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(containingNull, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-22"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void isAnyNonNull() {","lastModifiedDate":"2017-06-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull());","lastModifiedDate":"2017-06-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull((Object) null));","lastModifiedDate":"2017-06-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull((Object[]) null));","lastModifiedDate":"2017-06-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertTrue(CollectionUtil.isAnyNonNull(new Object()));","lastModifiedDate":"2017-06-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertTrue(CollectionUtil.isAnyNonNull(new Object(), null));","lastModifiedDate":"2017-06-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Asserts that {@code CollectionUtil#requireAllNonNull(Object...)} throw {@code NullPointerException}","lastModifiedDate":"2017-08-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * if {@code objects} or any element of {@code objects} is null.","lastModifiedDate":"2017-08-20"},{"lineNumber":89,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":90,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionThrown(Object... objects) {","lastModifiedDate":"2017-05-19"},{"lineNumber":91,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e CollectionUtil.requireAllNonNull(objects));","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Asserts that {@code CollectionUtil#requireAllNonNull(Collection\u003c?\u003e)} throw {@code NullPointerException}","lastModifiedDate":"2017-08-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * if {@code collection} or any element of {@code collection} is null.","lastModifiedDate":"2017-08-20"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":98,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionThrown(Collection\u003c?\u003e collection) {","lastModifiedDate":"2017-05-19"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e CollectionUtil.requireAllNonNull(collection));","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionNotThrown(Object... objects) {","lastModifiedDate":"2017-05-19"},{"lineNumber":103,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(objects);","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionNotThrown(Collection\u003c?\u003e collection) {","lastModifiedDate":"2017-05-19"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(collection);","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-22"}],"authorContributionMap":{"Wyrkx":8,"-":101}},{"path":"src/test/java/tutorpro/commons/util/ConfigUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Config;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ConfigUtilTest {","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"ConfigUtilTest\");","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Path tempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void read_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e read(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void read_missingFile_emptyResult() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(read(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void read_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e read(\"NotJsonFormatConfig.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void read_fileInOrder_successfullyRead() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Config expected \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"TypicalConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void read_valuesMissingFromFile_defaultValuesUsed() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"EmptyConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertEquals(new Config(), actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void read_extraValuesInFile_extraValuesIgnored() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Config expected \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"ExtraValuesConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private Config getTypicalConfig() {","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" Config config \u003d new Config();","lastModifiedDate":"2016-09-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" config.setLogLevel(Level.INFO);","lastModifiedDate":"2016-09-25"},{"lineNumber":68,"author":{"gitId":"-"},"content":" config.setUserPrefsFilePath(Paths.get(\"preferences.json\"));","lastModifiedDate":"2018-04-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return config;","lastModifiedDate":"2016-09-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private Optional\u003cConfig\u003e read(String configFileInTestDataFolder) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Path configFilePath \u003d addToTestDataPathIfNotNull(configFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return ConfigUtil.readConfig(configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void save_nullConfig_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e save(null, \"SomeFile.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void save_nullFile_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e save(new Config(), null));","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void saveConfig_allInOrder_success() throws DataLoadingException, IOException {","lastModifiedDate":"2023-06-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Config original \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":91,"author":{"gitId":"-"},"content":" Path configFilePath \u003d tempDir.resolve(\"TempConfig.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" //Try writing when the file doesn\u0027t exist","lastModifiedDate":"2016-09-24"},{"lineNumber":94,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(original, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Config readBack \u003d ConfigUtil.readConfig(configFilePath).get();","lastModifiedDate":"2016-12-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" //Try saving when the file exists","lastModifiedDate":"2016-09-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":" original.setLogLevel(Level.FINE);","lastModifiedDate":"2016-09-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(original, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":101,"author":{"gitId":"-"},"content":" readBack \u003d ConfigUtil.readConfig(configFilePath).get();","lastModifiedDate":"2016-12-20"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" private void save(Config config, String configFileInTestDataFolder) throws IOException {","lastModifiedDate":"2016-09-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Path configFilePath \u003d addToTestDataPathIfNotNull(configFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":107,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(config, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String configFileInTestDataFolder) {","lastModifiedDate":"2018-04-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return configFileInTestDataFolder !\u003d null","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(configFileInTestDataFolder)","lastModifiedDate":"2018-04-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2016-09-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":9,"-":108}},{"path":"src/test/java/tutorpro/commons/util/FileUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class FileUtilTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void isValidPath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" // valid path","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" assertTrue(FileUtil.isValidPath(\"valid/file/path\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" // invalid path","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" assertFalse(FileUtil.isValidPath(\"a\\0\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // null path -\u003e throws NullPointerException","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e FileUtil.isValidPath(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":4,"-":20}},{"path":"src/test/java/tutorpro/commons/util/JsonUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-10-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.SerializableTestClass;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TestUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Tests JSON Read and Write","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class JsonUtilTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Path SERIALIZATION_FILE \u003d TestUtil.getFilePathInSandboxFolder(\"serialize.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void serializeObjectToJsonFile_noExceptionThrown() throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":" SerializableTestClass serializableTestClass \u003d new SerializableTestClass();","lastModifiedDate":"2016-10-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":" serializableTestClass.setTestValues();","lastModifiedDate":"2016-10-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":" JsonUtil.serializeObjectToJsonFile(SERIALIZATION_FILE, serializableTestClass);","lastModifiedDate":"2016-10-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(FileUtil.readFromFile(SERIALIZATION_FILE), SerializableTestClass.JSON_STRING_REPRESENTATION);","lastModifiedDate":"2016-10-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void deserializeObjectFromJsonFile_noExceptionThrown() throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(SERIALIZATION_FILE, SerializableTestClass.JSON_STRING_REPRESENTATION);","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" SerializableTestClass serializableTestClass \u003d JsonUtil","lastModifiedDate":"2016-10-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .deserializeObjectFromJsonFile(SERIALIZATION_FILE, SerializableTestClass.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getName(), SerializableTestClass.getNameTestValue());","lastModifiedDate":"2016-10-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getListOfLocalDateTimes(), SerializableTestClass.getListTestValues());","lastModifiedDate":"2016-10-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getMapOfIntegerToString(), SerializableTestClass.getHashMapTestValues());","lastModifiedDate":"2016-10-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":" //TODO: @Test jsonUtil_readJsonStringToObjectInstance_correctObject()","lastModifiedDate":"2016-09-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":" //TODO: @Test jsonUtil_writeThenReadObjectToJson_correctObject()","lastModifiedDate":"2016-09-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":3,"-":42}},{"path":"src/test/java/tutorpro/commons/util/StringUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class StringUtilTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":" //---------------- Tests for isNonZeroUnsignedInteger --------------------------------------","lastModifiedDate":"2019-02-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void isNonZeroUnsignedInteger() {","lastModifiedDate":"2019-02-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // EP: empty strings","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"\")); // Boundary value","lastModifiedDate":"2017-06-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\" \"));","lastModifiedDate":"2017-06-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // EP: not a number","lastModifiedDate":"2016-10-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"a\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"aaa\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // EP: zero","lastModifiedDate":"2016-10-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"0\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // EP: zero as prefix","lastModifiedDate":"2017-06-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"01\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // EP: signed numbers","lastModifiedDate":"2016-10-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"-1\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"+1\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // EP: numbers with white space","lastModifiedDate":"2016-10-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\" 10 \")); // Leading/trailing spaces","lastModifiedDate":"2017-06-02"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"1 0\")); // Spaces in the middle","lastModifiedDate":"2017-06-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // EP: number larger than Integer.MAX_VALUE","lastModifiedDate":"2017-06-02"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2017-06-02"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // EP: valid numbers, should return true","lastModifiedDate":"2016-10-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"1\")); // Boundary value","lastModifiedDate":"2017-06-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"10\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" //---------------- Tests for containsWordIgnoreCase --------------------------------------","lastModifiedDate":"2016-10-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Invalid equivalence partitions for word: null, empty, multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Invalid equivalence partitions for sentence: null","lastModifiedDate":"2016-10-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * The four test cases below test one invalid input at a time.","lastModifiedDate":"2016-10-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_nullWord_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", null));","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_emptyWord_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, \"Word parameter cannot be empty\", ()","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":" -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", \" \"));","lastModifiedDate":"2019-03-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_multipleWords_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":71,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, \"Word parameter should be a single word\", ()","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"-"},"content":" -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", \"aaa BBB\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_nullSentence_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e StringUtil.containsWordIgnoreCase(null, \"abc\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Valid equivalence partitions for word:","lastModifiedDate":"2016-10-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * - any word","lastModifiedDate":"2016-10-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * - word containing symbols/numbers","lastModifiedDate":"2016-10-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * - word with leading/trailing spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Valid equivalence partitions for sentence:","lastModifiedDate":"2016-10-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * - empty string","lastModifiedDate":"2016-10-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * - one word","lastModifiedDate":"2016-10-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * - multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * - sentence with extra spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Possible scenarios returning true:","lastModifiedDate":"2016-10-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - matches first word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - last word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - middle word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * - matches multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Possible scenarios returning false:","lastModifiedDate":"2016-10-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * - query word matches part of a sentence word","lastModifiedDate":"2016-10-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * - sentence word matches part of the query word","lastModifiedDate":"2016-10-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * The test method below tries to verify all above with a reasonably low number of test cases.","lastModifiedDate":"2016-10-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_validInputs_correctResult() {","lastModifiedDate":"2016-10-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // Empty sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"\", \"abc\")); // Boundary case","lastModifiedDate":"2016-10-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\" \", \"123\"));","lastModifiedDate":"2016-10-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" // Matches a partial word only","lastModifiedDate":"2016-10-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \"bb\")); // Sentence word bigger than query word","lastModifiedDate":"2016-10-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \"bbbb\")); // Query word bigger than sentence word","lastModifiedDate":"2016-10-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" // Matches word in the sentence, different upper/lower case letters","lastModifiedDate":"2016-10-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bBb ccc\", \"Bbb\")); // First word (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bBb ccc@1\", \"CCc@1\")); // Last word (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\" AAA bBb ccc \", \"aaa\")); // Sentence has extra spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"Aaa\", \"aaa\")); // Only one word in sentence (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \" ccc \")); // Leading/trailing spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // Matches multiple words in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"AAA bBb ccc bbb\", \"bbB\"));","lastModifiedDate":"2016-10-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" //---------------- Tests for getDetails --------------------------------------","lastModifiedDate":"2016-10-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * Equivalence Partitions: null, valid throwable object","lastModifiedDate":"2016-10-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public void getDetails_exceptionGiven() {","lastModifiedDate":"2016-09-30"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.getDetails(new FileNotFoundException(\"file not found\"))","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .contains(\"java.io.FileNotFoundException: file not found\"));","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":139,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public void getDetails_nullGiven_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":141,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e StringUtil.getDetails(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":144,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"Wyrkx":8,"-":136}},{"path":"src/test/java/tutorpro/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.TypicalPersons.AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ListCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonAddressBookStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonUserPrefsStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.StorageManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":137,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":138,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":155,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":156,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":159,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":168,"author":{"gitId":"-"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY;","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"Wyrkx":23,"-":152}},{"path":"src/test/java/tutorpro/logic/commands/AddCommandIntegrationTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code AddCommand}.","lastModifiedDate":"2017-06-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AddCommandIntegrationTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-15"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void execute_newPerson_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" expectedModel.addPerson(validPerson);","lastModifiedDate":"2017-06-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new AddCommand(validPerson), model,","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" expectedModel);","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(0);","lastModifiedDate":"2018-01-10"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(new AddCommand(personInList), model,","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AddCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"Wyrkx":12,"-":35}},{"path":"src/test/java/tutorpro/logic/commands/AddCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-01-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-05-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class AddCommandTest {","lastModifiedDate":"2017-05-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new AddCommand(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2017-05-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2017-05-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new AddCommand(validPerson).execute(modelStub);","lastModifiedDate":"2019-01-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2017-05-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" AddCommand addCommand \u003d new AddCommand(validPerson);","lastModifiedDate":"2018-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(CommandException.class, AddCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Person alice \u003d new PersonBuilder().withName(\"Alice\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Person bob \u003d new PersonBuilder().withName(\"Bob\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":61,"author":{"gitId":"-"},"content":" AddCommand addAliceCommand \u003d new AddCommand(alice);","lastModifiedDate":"2017-06-22"},{"lineNumber":62,"author":{"gitId":"-"},"content":" AddCommand addBobCommand \u003d new AddCommand(bob);","lastModifiedDate":"2017-06-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" AddCommand addAliceCommandCopy \u003d new AddCommand(alice);","lastModifiedDate":"2017-06-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2017-06-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2017-06-22"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2017-06-22"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" AddCommand addCommand \u003d new AddCommand(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" String expected \u003d AddCommand.class.getCanonicalName() + \"{toAdd\u003d\" + TypicalPersons.ALICE + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2017-05-12"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2017-05-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":119,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":124,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2018-11-27"},{"lineNumber":129,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":137,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":139,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":143,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":147,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":148,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":149,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":152,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":153,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":158,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":159,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":163,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2018-08-07"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":166,"author":{"gitId":"-"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2018-08-07"},{"lineNumber":167,"author":{"gitId":"-"},"content":" private final Person person;","lastModifiedDate":"2018-08-07"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":170,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2018-08-07"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":176,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":181,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2017-05-12"},{"lineNumber":183,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2017-05-12"},{"lineNumber":185,"author":{"gitId":"-"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2017-05-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":187,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-07"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":190,"author":{"gitId":"-"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":193,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-08"},{"lineNumber":195,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":196,"author":{"gitId":"-"},"content":" personsAdded.add(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":197,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":" return new AddressBook();","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-12"}],"authorContributionMap":{"Wyrkx":17,"-":188}},{"path":"src/test/java/tutorpro/logic/commands/ClearCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"public class ClearCommandTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" public void execute_emptyAddressBook_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" Model model \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" public void execute_nonEmptyAddressBook_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" Model expectedModel \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" expectedModel.setAddressBook(new AddressBook());","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":32}},{"path":"src/test/java/tutorpro/logic/commands/CommandResultTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class CommandResultTest {","lastModifiedDate":"2018-12-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(new CommandResult(\"feedback\")));","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(new CommandResult(\"feedback\", false, false)));","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(commandResult));","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(null));","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(0.5f));","lastModifiedDate":"2018-12-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // different feedbackToUser value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"different\")));","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // different showHelp value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"feedback\", true, false)));","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // different exit value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"feedback\", false, true)));","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void hashcode() {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // same values -\u003e returns same hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(commandResult.hashCode(), new CommandResult(\"feedback\").hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // different feedbackToUser value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"different\").hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // different showHelp value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"feedback\", true, false).hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different exit value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"feedback\", false, true).hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String expected \u003d CommandResult.class.getCanonicalName() + \"{feedbackToUser\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" + commandResult.getFeedbackToUser() + \", showHelp\u003d\" + commandResult.isShowHelp()","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" + \", exit\u003d\" + commandResult.isExit() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertEquals(expected, commandResult.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-12-09"}],"authorContributionMap":{"Wyrkx":1,"-":62}},{"path":"src/test/java/tutorpro/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.CliSyntax;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_NAME_DESC \u003d \" \" + CliSyntax.PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \" + CliSyntax.PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + CliSyntax.PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + CliSyntax.PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_TAG_DESC \u003d \" \" + CliSyntax.PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":77,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":91,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":111,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":120,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"Wyrkx":28,"-":97}},{"path":"src/test/java/tutorpro/logic/commands/DeleteCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for","lastModifiedDate":"2020-12-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * {@code DeleteCommand}.","lastModifiedDate":"2018-01-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class DeleteCommandTest {","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void execute_validIndexUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2019-02-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void execute_invalidIndexUnfilteredList_throwsCommandException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-06-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(outOfBoundIndex);","lastModifiedDate":"2018-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void execute_validIndexFilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" showNoPerson(expectedModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void execute_invalidIndexFilteredList_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":" Index outOfBoundIndex \u003d TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-06-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(outOfBoundIndex);","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":76,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteFirstCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteSecondCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_SECOND_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteFirstCommandCopy \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(deleteSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Index targetIndex \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(targetIndex);","lastModifiedDate":"2019-02-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String expected \u003d DeleteCommand.class.getCanonicalName() + \"{targetIndex\u003d\" + targetIndex + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertEquals(expected, deleteCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show no one.","lastModifiedDate":"2017-06-05"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" private void showNoPerson(Model model) {","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(p -\u003e false);","lastModifiedDate":"2017-06-12"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertTrue(model.getFilteredPersonList().isEmpty());","lastModifiedDate":"2018-02-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":117,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"Wyrkx":25,"-":92}},{"path":"src/test/java/tutorpro/logic/commands/EditCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for EditCommand.","lastModifiedDate":"2020-12-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class EditCommandTest {","lastModifiedDate":"2017-05-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_allFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-26"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(editedPerson).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void execute_someFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Index indexLastPerson \u003d Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Person lastPerson \u003d model.getFilteredPersonList().get(indexLastPerson.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":48,"author":{"gitId":"-"},"content":" PersonBuilder personInList \u003d new PersonBuilder(lastPerson);","lastModifiedDate":"2017-05-18"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" Person editedPerson \u003d personInList.withName(CommandTestUtil.VALID_NAME_BOB).withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).withTags(CommandTestUtil.VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(indexLastPerson, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":56,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" expectedModel.setPerson(lastPerson, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void execute_noFieldSpecifiedUnfilteredList_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, new EditCommand.EditPersonDescriptor());","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":" Person editedPerson \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void execute_filteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":" Person personInFilteredList \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" Person editedPerson \u003d new PersonBuilder(personInFilteredList).withName(CommandTestUtil.VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_BOB).build());","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"Wyrkx"},"content":" Person firstPerson \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(firstPerson).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_SECOND_PERSON, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":106,"author":{"gitId":"-"},"content":" // edit person in filtered list into a duplicate in address book","lastModifiedDate":"2017-05-18"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(TypicalIndexes.INDEX_SECOND_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder(personInList).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":111,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":114,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-05-18"},{"lineNumber":117,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":123,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-18"},{"lineNumber":124,"author":{"gitId":"-"},"content":" * Edit filtered list where index is larger than size of filtered list,","lastModifiedDate":"2017-05-18"},{"lineNumber":125,"author":{"gitId":"-"},"content":" * but smaller than size of address book","lastModifiedDate":"2017-05-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-18"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":129,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":130,"author":{"gitId":"Wyrkx"},"content":" Index outOfBoundIndex \u003d TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-05-18"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":134,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex,","lastModifiedDate":"2018-08-08"},{"lineNumber":135,"author":{"gitId":"Wyrkx"},"content":" new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_BOB).build());","lastModifiedDate":"2024-03-11"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":137,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":140,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":142,"author":{"gitId":"Wyrkx"},"content":" final EditCommand standardCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, CommandTestUtil.DESC_AMY);","lastModifiedDate":"2024-03-11"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":145,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor copyDescriptor \u003d new EditCommand.EditPersonDescriptor(CommandTestUtil.DESC_AMY);","lastModifiedDate":"2024-03-11"},{"lineNumber":146,"author":{"gitId":"Wyrkx"},"content":" EditCommand commandWithSameValues \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, copyDescriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(commandWithSameValues));","lastModifiedDate":"2017-05-08"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":149,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":150,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(standardCommand));","lastModifiedDate":"2017-05-08"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":153,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(null));","lastModifiedDate":"2017-05-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":155,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new ClearCommand()));","lastModifiedDate":"2017-05-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":159,"author":{"gitId":"Wyrkx"},"content":" assertFalse(standardCommand.equals(new EditCommand(TypicalIndexes.INDEX_SECOND_PERSON, CommandTestUtil.DESC_AMY)));","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" // different descriptor -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":162,"author":{"gitId":"Wyrkx"},"content":" assertFalse(standardCommand.equals(new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, CommandTestUtil.DESC_BOB)));","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":168,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor editPersonDescriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":169,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2019-02-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":" String expected \u003d EditCommand.class.getCanonicalName() + \"{index\u003d\" + index + \", editPersonDescriptor\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" + editPersonDescriptor + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":" assertEquals(expected, editCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-08"}],"authorContributionMap":{"Wyrkx":51,"-":124}},{"path":"src/test/java/tutorpro/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" public void equals() {","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptorWithSameValues \u003d new EditCommand.EditPersonDescriptor(CommandTestUtil.DESC_AMY);","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(CommandTestUtil.DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(CommandTestUtil.DESC_AMY.equals(CommandTestUtil.DESC_AMY));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(5));","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(CommandTestUtil.DESC_BOB));","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" // different name -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY).withName(CommandTestUtil.VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY).withPhone(CommandTestUtil.VALID_PHONE_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" // different email -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY).withEmail(CommandTestUtil.VALID_EMAIL_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" // different address -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY).withAddress(CommandTestUtil.VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY).withTags(CommandTestUtil.VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor editPersonDescriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" String expected \u003d EditCommand.EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getName().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":64}},{"path":"src/test/java/tutorpro/logic/commands/ExitCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"public class ExitCommandTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" private Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" public void execute_exit_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(ExitCommand.MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true);","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new ExitCommand(), model, expectedCommandResult, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":19}},{"path":"src/test/java/tutorpro/logic/commands/FindCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code FindCommand}.","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class FindCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" private Model expectedModel \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"first\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"second\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" FindCommand findFirstCommand \u003d new FindCommand(firstPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" FindCommand findSecondCommand \u003d new FindCommand(secondPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" FindCommand findFirstCommandCopy \u003d new FindCommand(firstPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(findSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void execute_zeroKeywords_noPersonFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, 0);","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\" \");","lastModifiedDate":"2018-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" FindCommand command \u003d new FindCommand(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void execute_multipleKeywords_multiplePersonsFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, 3);","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\"Kurz Elle Kunz\");","lastModifiedDate":"2018-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" FindCommand command \u003d new FindCommand(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":71,"author":{"gitId":"Wyrkx"},"content":" assertEquals(Arrays.asList(TypicalPersons.CARL, TypicalPersons.ELLE, TypicalPersons.FIONA), model.getFilteredPersonList());","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"keyword\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" FindCommand findCommand \u003d new FindCommand(predicate);","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" String expected \u003d FindCommand.class.getCanonicalName() + \"{predicate\u003d\" + predicate + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertEquals(expected, findCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-12"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}.","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":" private NameContainsKeywordsPredicate preparePredicate(String userInput) {","lastModifiedDate":"2018-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return new NameContainsKeywordsPredicate(Arrays.asList(userInput.split(\"\\\\s+\")));","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"Wyrkx":13,"-":75}},{"path":"src/test/java/tutorpro/logic/commands/HelpCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class HelpCommandTest {","lastModifiedDate":"2017-06-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public void execute_help_success() {","lastModifiedDate":"2017-06-08"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(HelpCommand.SHOWING_HELP_MESSAGE, true, false);","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" assertCommandSuccess(new HelpCommand(), model, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-08"}],"authorContributionMap":{"Wyrkx":5,"-":14}},{"path":"src/test/java/tutorpro/logic/commands/ListCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for ListCommand.","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class ListCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private Model expectedModel;","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_listIsNotFiltered_showsSameList() {","lastModifiedDate":"2017-08-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ListCommand(), model, ListCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void execute_listIsFiltered_showsEverything() {","lastModifiedDate":"2017-08-15"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ListCommand(), model, ListCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"Wyrkx":10,"-":29}},{"path":"src/test/java/tutorpro/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" Person expectedPerson \u003d new PersonBuilder(TypicalPersons.BOB).withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" // whitespace only preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, CommandTestUtil.PREAMBLE_WHITESPACE + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" // multiple tags - all accepted","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(TypicalPersons.BOB).withTags(CommandTestUtil.VALID_TAG_FRIEND, CommandTestUtil.VALID_TAG_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" .build();","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" String validExpectedPersonString \u003d CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" // multiple names","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" // multiple phones","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" // multiple emails","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" // multiple addresses","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" // multiple fields repeated","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" validExpectedPersonString + CommandTestUtil.PHONE_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME, CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" // invalid value followed by valid value","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":" // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"Wyrkx"},"content":" // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" // valid value followed by invalid value","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_NAME_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_EMAIL_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_PHONE_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"Wyrkx"},"content":" // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"Wyrkx"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"Wyrkx"},"content":" // zero tags","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"Wyrkx"},"content":" Person expectedPerson \u003d new PersonBuilder(TypicalPersons.AMY).withTags().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"Wyrkx"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"Wyrkx"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"Wyrkx"},"content":" // missing name prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"Wyrkx"},"content":" // missing phone prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.VALID_PHONE_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"Wyrkx"},"content":" // missing email prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":122,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.VALID_EMAIL_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":123,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":124,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":125,"author":{"gitId":"Wyrkx"},"content":" // missing address prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":127,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":128,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":129,"author":{"gitId":"Wyrkx"},"content":" // all prefixes missing","lastModifiedDate":"2024-03-11"},{"lineNumber":130,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB + CommandTestUtil.VALID_PHONE_BOB + CommandTestUtil.VALID_EMAIL_BOB + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":131,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":132,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":133,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":134,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":135,"author":{"gitId":"Wyrkx"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":136,"author":{"gitId":"Wyrkx"},"content":" // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":137,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":138,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":139,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":140,"author":{"gitId":"Wyrkx"},"content":" // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":141,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":142,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":143,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":144,"author":{"gitId":"Wyrkx"},"content":" // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":145,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.INVALID_EMAIL_DESC + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":146,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":147,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":148,"author":{"gitId":"Wyrkx"},"content":" // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":149,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":150,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":151,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":152,"author":{"gitId":"Wyrkx"},"content":" // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":153,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":154,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.INVALID_TAG_DESC + CommandTestUtil.VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":155,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":156,"author":{"gitId":"Wyrkx"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2024-03-11"},{"lineNumber":157,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":158,"author":{"gitId":"Wyrkx"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":159,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"Wyrkx"},"content":" // non-empty preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":161,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.PREAMBLE_NON_EMPTY + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":162,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"Wyrkx"},"content":" String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-11"},{"lineNumber":164,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":165,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":165}},{"path":"src/test/java/tutorpro/logic/parser/AddressBookParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-06-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ClearCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ExitCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.HelpCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ListCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"public class AddressBookParserTest {","lastModifiedDate":"2017-07-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private final AddressBookParser parser \u003d new AddressBookParser();","lastModifiedDate":"2017-07-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void parseCommand_add() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" AddCommand command \u003d (AddCommand) parser.parseCommand(PersonUtil.getAddCommand(person));","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(new AddCommand(person), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void parseCommand_clear() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD) instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD + \" 3\") instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void parseCommand_delete() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" DeleteCommand command \u003d (DeleteCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand.COMMAND_WORD + \" \" + TypicalIndexes.INDEX_FIRST_PERSON.getOneBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" assertEquals(new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON), command);","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void parseCommand_edit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(person).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":" EditCommand command \u003d (EditCommand) parser.parseCommand(EditCommand.COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-27"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" + TypicalIndexes.INDEX_FIRST_PERSON.getOneBased() + \" \" + PersonUtil.getEditPersonDescriptorDetails(descriptor));","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" assertEquals(new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, descriptor), command);","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parseCommand_exit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD) instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD + \" 3\") instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void parseCommand_find() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d Arrays.asList(\"foo\", \"bar\", \"baz\");","lastModifiedDate":"2017-06-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":" FindCommand command \u003d (FindCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":" FindCommand.COMMAND_WORD + \" \" + keywords.stream().collect(Collectors.joining(\" \")));","lastModifiedDate":"2017-06-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertEquals(new FindCommand(new NameContainsKeywordsPredicate(keywords)), command);","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public void parseCommand_help() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD) instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD + \" 3\") instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void parseCommand_list() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD) instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD + \" 3\") instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void parseCommand_unrecognisedInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(ParseException.class, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE), ()","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"-"},"content":" -\u003e parser.parseCommand(\"\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void parseCommand_unknownCommand_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(ParseException.class, Messages.MESSAGE_UNKNOWN_COMMAND, () -\u003e parser.parseCommand(\"unknownCommand\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"Wyrkx":26,"-":74}},{"path":"src/test/java/tutorpro/logic/parser/ArgumentTokenizerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class ArgumentTokenizerTest {","lastModifiedDate":"2016-10-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private final Prefix unknownPrefix \u003d new Prefix(\"--u\");","lastModifiedDate":"2016-10-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final Prefix pSlash \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-03-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final Prefix dashT \u003d new Prefix(\"-t\");","lastModifiedDate":"2016-10-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private final Prefix hatQ \u003d new Prefix(\"^Q\");","lastModifiedDate":"2016-10-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void tokenize_emptyArgsString_noValues() {","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String argsString \u003d \" \";","lastModifiedDate":"2016-10-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private void assertPreamblePresent(ArgumentMultimap argMultimap, String expectedPreamble) {","lastModifiedDate":"2017-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(expectedPreamble, argMultimap.getPreamble());","lastModifiedDate":"2017-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private void assertPreambleEmpty(ArgumentMultimap argMultimap) {","lastModifiedDate":"2017-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertTrue(argMultimap.getPreamble().isEmpty());","lastModifiedDate":"2017-03-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Asserts all the arguments in {@code argMultimap} with {@code prefix} match the {@code expectedValues}","lastModifiedDate":"2017-08-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * and only the last value is returned upon calling {@code ArgumentMultimap#getValue(Prefix)}.","lastModifiedDate":"2017-08-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private void assertArgumentPresent(ArgumentMultimap argMultimap, Prefix prefix, String... expectedValues) {","lastModifiedDate":"2017-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // Verify the last value is returned","lastModifiedDate":"2016-10-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[expectedValues.length - 1], argMultimap.getValue(prefix).get());","lastModifiedDate":"2017-06-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // Verify the number of values returned is as expected","lastModifiedDate":"2016-10-16"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertEquals(expectedValues.length, argMultimap.getAllValues(prefix).size());","lastModifiedDate":"2017-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Verify all values returned are as expected and in order","lastModifiedDate":"2016-10-16"},{"lineNumber":47,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c expectedValues.length; i++) {","lastModifiedDate":"2016-10-16"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[i], argMultimap.getAllValues(prefix).get(i));","lastModifiedDate":"2017-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private void assertArgumentAbsent(ArgumentMultimap argMultimap, Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(argMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void tokenize_noPrefixes_allTakenAsPreamble() {","lastModifiedDate":"2016-10-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String argsString \u003d \" some random string /t tag with leading and trailing spaces \";","lastModifiedDate":"2016-10-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString);","lastModifiedDate":"2017-03-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":61,"author":{"gitId":"-"},"content":" // Same string expected as preamble, but leading/trailing spaces should be trimmed","lastModifiedDate":"2016-10-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString.trim());","lastModifiedDate":"2017-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void tokenize_oneArgument() {","lastModifiedDate":"2016-10-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Preamble present","lastModifiedDate":"2016-10-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String argsString \u003d \" Some preamble string p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Some preamble string\");","lastModifiedDate":"2017-03-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // No preamble","lastModifiedDate":"2016-10-16"},{"lineNumber":75,"author":{"gitId":"-"},"content":" argsString \u003d \" p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void tokenize_multipleArguments() {","lastModifiedDate":"2016-10-16"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // Only two arguments are present","lastModifiedDate":"2016-10-16"},{"lineNumber":85,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-03-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // All three arguments are present","lastModifiedDate":"2017-05-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" argsString \u003d \"Different Preamble String ^Q111 -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Different Preamble String\");","lastModifiedDate":"2017-03-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"111\");","lastModifiedDate":"2017-03-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /* Also covers: Reusing of the tokenizer multiple times */","lastModifiedDate":"2016-10-16"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // Reuse tokenizer on an empty string to ensure ArgumentMultimap is correctly reset","lastModifiedDate":"2017-03-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // (i.e. no stale values from the previous tokenizing remain)","lastModifiedDate":"2017-03-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" argsString \u003d \"\";","lastModifiedDate":"2017-03-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /* Also covers: testing for prefixes not specified as a prefix */","lastModifiedDate":"2020-05-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Prefixes not previously given to the tokenizer should not return any values","lastModifiedDate":"2016-10-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" argsString \u003d unknownPrefix + \"some value\";","lastModifiedDate":"2017-05-09"},{"lineNumber":113,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, unknownPrefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString); // Unknown prefix is taken as part of preamble","lastModifiedDate":"2017-03-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsWithRepeats() {","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // Two arguments repeated, some have empty values","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value ^Q ^Q -t another dashT value p/ pSlash value -t\";","lastModifiedDate":"2017-03-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\", \"another dashT value\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-19"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsJoined() {","lastModifiedDate":"2017-05-19"},{"lineNumber":131,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleStringp/ pSlash joined-tjoined -t not joined^Qjoined\";","lastModifiedDate":"2017-05-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleStringp/ pSlash joined-tjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-05-19"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"not joined^Qjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public void equalsMethod() {","lastModifiedDate":"2016-10-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Prefix aaa \u003d new Prefix(\"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":143,"author":{"gitId":"-"},"content":" assertEquals(aaa, aaa);","lastModifiedDate":"2016-10-16"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertEquals(aaa, new Prefix(\"aaa\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, \"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, new Prefix(\"aab\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":150,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-16"}],"authorContributionMap":{"Wyrkx":1,"-":149}},{"path":"src/test/java/tutorpro/logic/parser/CommandParserTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Contains helper methods for testing command parsers.","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class CommandParserTestUtil {","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is successful and the command created","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * equals to {@code expectedCommand}.","lastModifiedDate":"2017-07-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static void assertParseSuccess(Parser\u003c? extends Command\u003e parser, String userInput,","lastModifiedDate":"2022-02-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Command expectedCommand) {","lastModifiedDate":"2022-02-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Command command \u003d parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertEquals(expectedCommand, command);","lastModifiedDate":"2017-07-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(\"Invalid userInput.\", pe);","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is unsuccessful and the error message","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * equals to {@code expectedMessage}.","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static void assertParseFailure(Parser\u003c? extends Command\u003e parser, String userInput, String expectedMessage) {","lastModifiedDate":"2022-02-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-07-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" throw new AssertionError(\"The expected ParseException was not thrown.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-07-06"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(expectedMessage, pe.getMessage());","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"Wyrkx":5,"-":35}},{"path":"src/test/java/tutorpro/logic/parser/DeleteCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * As we are only doing white-box testing, our test cases do not cover path variations","lastModifiedDate":"2017-06-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * outside of the DeleteCommand code. For example, inputs \"1\" and \"1 abc\" take the","lastModifiedDate":"2017-06-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * same path through the DeleteCommand, and therefore we test only one of them.","lastModifiedDate":"2017-06-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * The path variation for those two cases occur inside the ParserUtil, and","lastModifiedDate":"2017-06-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * therefore should be covered by the ParserUtilTest.","lastModifiedDate":"2017-06-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class DeleteCommandParserTest {","lastModifiedDate":"2017-06-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private DeleteCommandParser parser \u003d new DeleteCommandParser();","lastModifiedDate":"2017-06-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsDeleteCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, \"1\", new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON));","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void parse_invalidArgs_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"a\", String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"Wyrkx":6,"-":23}},{"path":"src/test/java/tutorpro/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" private static final String TAG_EMPTY \u003d \" \" + CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" // no index specified","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" // no field specified","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" // no index and no field specified","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" // negative index","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"-5\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" // zero index","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"0\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.TAG_DESC_FRIEND + TAG_EMPTY + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + TAG_EMPTY + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\" + CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.INVALID_EMAIL_DESC + CommandTestUtil.VALID_ADDRESS_AMY + CommandTestUtil.VALID_PHONE_AMY,","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"Wyrkx"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"Wyrkx"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).withEmail(CommandTestUtil.VALID_EMAIL_AMY).withAddress(CommandTestUtil.VALID_ADDRESS_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND, CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"Wyrkx"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"Wyrkx"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"Wyrkx"},"content":" // name","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"Wyrkx"},"content":" // phone","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(CommandTestUtil.VALID_PHONE_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"Wyrkx"},"content":" // email","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":122,"author":{"gitId":"Wyrkx"},"content":" // address","lastModifiedDate":"2024-03-11"},{"lineNumber":123,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":124,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(CommandTestUtil.VALID_ADDRESS_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":125,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":127,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":128,"author":{"gitId":"Wyrkx"},"content":" // tags","lastModifiedDate":"2024-03-11"},{"lineNumber":129,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":130,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":131,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":132,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":133,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":134,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":135,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":136,"author":{"gitId":"Wyrkx"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":137,"author":{"gitId":"Wyrkx"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2024-03-11"},{"lineNumber":138,"author":{"gitId":"Wyrkx"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2024-03-11"},{"lineNumber":139,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":140,"author":{"gitId":"Wyrkx"},"content":" // valid followed by invalid","lastModifiedDate":"2024-03-11"},{"lineNumber":141,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":142,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":143,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":144,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":145,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":146,"author":{"gitId":"Wyrkx"},"content":" // invalid followed by valid","lastModifiedDate":"2024-03-11"},{"lineNumber":147,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":148,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":149,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":150,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":151,"author":{"gitId":"Wyrkx"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2024-03-11"},{"lineNumber":152,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":153,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.PHONE_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-11"},{"lineNumber":154,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":155,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":156,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput,","lastModifiedDate":"2024-03-11"},{"lineNumber":157,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE, CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":158,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":159,"author":{"gitId":"Wyrkx"},"content":" // multiple invalid values","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.INVALID_ADDRESS_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":161,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.INVALID_ADDRESS_DESC + CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":162,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput,","lastModifiedDate":"2024-03-11"},{"lineNumber":164,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE, CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":165,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":166,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":167,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":168,"author":{"gitId":"Wyrkx"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":169,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":170,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2024-03-11"},{"lineNumber":171,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":172,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":173,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":174,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":175,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":176,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":177,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":177}},{"path":"src/test/java/tutorpro/logic/parser/FindCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParserTest {","lastModifiedDate":"2017-06-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private FindCommandParser parser \u003d new FindCommandParser();","lastModifiedDate":"2017-06-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void parse_emptyArg_throwsParseException() {","lastModifiedDate":"2017-06-27"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" assertParseFailure(parser, \" \", String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsFindCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // no leading and trailing whitespaces","lastModifiedDate":"2017-06-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" FindCommand expectedFindCommand \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\")));","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"Alice Bob\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // multiple whitespaces between keywords","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \" \\n Alice \\n \\t Bob \\t\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-27"}],"authorContributionMap":{"Wyrkx":7,"-":27}},{"path":"src/test/java/tutorpro/logic/parser/ParserUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.ParserUtil.MESSAGE_INVALID_INDEX;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-05-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-05-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-05-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtilTest {","lastModifiedDate":"2017-05-22"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2017-05-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2017-05-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2017-05-22"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d \"Rachel Walker\";","lastModifiedDate":"2017-05-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d \"123456\";","lastModifiedDate":"2017-05-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d \"123 Main Street #0505\";","lastModifiedDate":"2017-05-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d \"rachel@example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_1 \u003d \"friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_2 \u003d \"neighbour\";","lastModifiedDate":"2017-05-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String WHITESPACE \u003d \" \\t\\r\\n\";","lastModifiedDate":"2017-05-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void parseIndex_invalidInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseIndex(\"10 a\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void parseIndex_outOfRangeInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_INVALID_INDEX, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" -\u003e ParserUtil.parseIndex(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2019-03-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void parseIndex_validInput_success() throws Exception {","lastModifiedDate":"2017-05-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // No whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\"1\"));","lastModifiedDate":"2017-05-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // Leading and trailing whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\" 1 \"));","lastModifiedDate":"2017-05-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void parseName_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseName((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parseName_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseName(INVALID_NAME));","lastModifiedDate":"2019-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parseName_validValueWithoutWhitespace_returnsName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(VALID_NAME));","lastModifiedDate":"2017-05-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String nameWithWhitespace \u003d WHITESPACE + VALID_NAME + WHITESPACE;","lastModifiedDate":"2017-05-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace));","lastModifiedDate":"2017-05-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void parsePhone_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePhone((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void parsePhone_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePhone(INVALID_PHONE));","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-22"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE));","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" String phoneWithWhitespace \u003d WHITESPACE + VALID_PHONE + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void parseAddress_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseAddress((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":110,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":111,"author":{"gitId":"-"},"content":" public void parseAddress_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseAddress(INVALID_ADDRESS));","lastModifiedDate":"2019-03-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":115,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-22"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":123,"author":{"gitId":"-"},"content":" String addressWithWhitespace \u003d WHITESPACE + VALID_ADDRESS + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-30"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public void parseEmail_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmail((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public void parseEmail_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmail(INVALID_EMAIL));","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-22"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL));","lastModifiedDate":"2017-05-30"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" String emailWithWhitespace \u003d WHITESPACE + VALID_EMAIL + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-30"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void parseTag_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTag(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":156,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public void parseTag_invalidValue_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTag(INVALID_TAG));","lastModifiedDate":"2019-03-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":161,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithoutWhitespace_returnsTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":163,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":164,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(VALID_TAG_1));","lastModifiedDate":"2017-05-30"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":167,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":168,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithWhitespace_returnsTrimmedTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":169,"author":{"gitId":"-"},"content":" String tagWithWhitespace \u003d WHITESPACE + VALID_TAG_1 + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(tagWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public void parseTags_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTags(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":179,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":180,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithInvalidTags_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, INVALID_TAG)));","lastModifiedDate":"2019-03-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":184,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public void parseTags_emptyCollection_returnsEmptySet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":186,"author":{"gitId":"-"},"content":" assertTrue(ParserUtil.parseTags(Collections.emptyList()).isEmpty());","lastModifiedDate":"2017-05-22"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":189,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":191,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e actualTagSet \u003d ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, VALID_TAG_2));","lastModifiedDate":"2017-05-22"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e expectedTagSet \u003d new HashSet\u003cTag\u003e(Arrays.asList(new Tag(VALID_TAG_1), new Tag(VALID_TAG_2)));","lastModifiedDate":"2017-05-22"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":194,"author":{"gitId":"-"},"content":" assertEquals(expectedTagSet, actualTagSet);","lastModifiedDate":"2017-05-22"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-22"}],"authorContributionMap":{"Wyrkx":10,"-":186}},{"path":"src/test/java/tutorpro/model/AddressBookTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2016-12-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2016-12-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-12-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-12-24"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookTest {","lastModifiedDate":"2016-12-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2016-12-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), addressBook.getPersonList());","lastModifiedDate":"2016-12-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e addressBook.resetData(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void resetData_withValidReadOnlyAddressBook_replacesData() {","lastModifiedDate":"2016-12-24"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" AddressBook newData \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" addressBook.resetData(newData);","lastModifiedDate":"2016-12-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(newData, addressBook);","lastModifiedDate":"2016-12-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void resetData_withDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Two persons with the same identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-04-19"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" List\u003cPerson\u003e newPersons \u003d Arrays.asList(TypicalPersons.ALICE, editedAlice);","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBookStub newData \u003d new AddressBookStub(newPersons);","lastModifiedDate":"2018-03-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e addressBook.resetData(newData));","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e addressBook.hasPerson(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" assertFalse(addressBook.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":" addressBook.addPerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":" assertTrue(addressBook.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" addressBook.addPerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"Wyrkx"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertTrue(addressBook.hasPerson(editedAlice));","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void getPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, () -\u003e addressBook.getPersonList().remove(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expected \u003d AddressBook.class.getCanonicalName() + \"{persons\u003d\" + addressBook.getPersonList() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertEquals(expected, addressBook.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * A stub ReadOnlyAddressBook whose persons list can violate interface constraints.","lastModifiedDate":"2018-03-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static class AddressBookStub implements ReadOnlyAddressBook {","lastModifiedDate":"2016-12-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e persons \u003d FXCollections.observableArrayList();","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" AddressBookStub(Collection\u003cPerson\u003e persons) {","lastModifiedDate":"2018-03-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.persons.setAll(persons);","lastModifiedDate":"2016-12-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return persons;","lastModifiedDate":"2016-12-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-24"}],"authorContributionMap":{"Wyrkx":21,"-":87}},{"path":"src/test/java/tutorpro/model/ModelManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-31"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.AddressBookBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ModelManagerTest {","lastModifiedDate":"2017-05-31"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private ModelManager modelManager \u003d new ModelManager();","lastModifiedDate":"2018-08-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(new GuiSettings(), modelManager.getGuiSettings());","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(new AddressBook(), new AddressBook(modelManager.getAddressBook()));","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefs_nullUserPrefs_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.setUserPrefs(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void setUserPrefs_validUserPrefs_copiesUserPrefs() {","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"address/book/file/path\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1, 2, 3, 4));","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" modelManager.setUserPrefs(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(userPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Modifying userPrefs should not modify modelManager\u0027s userPrefs","lastModifiedDate":"2018-12-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs oldUserPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"new/address/book/file/path\"));","lastModifiedDate":"2018-12-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(oldUserPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.setGuiSettings(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setGuiSettings_validGuiSettings_setsGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(1, 2, 3, 4);","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" modelManager.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(guiSettings, modelManager.getGuiSettings());","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.setAddressBookFilePath(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_validPath_setsAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Path path \u003d Paths.get(\"address/book/file/path\");","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" modelManager.setAddressBookFilePath(path);","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(path, modelManager.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.hasPerson(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" assertFalse(modelManager.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"Wyrkx"},"content":" modelManager.addPerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" assertTrue(modelManager.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, () -\u003e modelManager.getFilteredPersonList().remove(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-31"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" AddressBook addressBook \u003d new AddressBookBuilder().withPerson(TypicalPersons.ALICE).withPerson(TypicalPersons.BENSON).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"-"},"content":" AddressBook differentAddressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" modelManager \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2018-08-06"},{"lineNumber":104,"author":{"gitId":"-"},"content":" ModelManager modelManagerCopy \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2017-05-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManagerCopy));","lastModifiedDate":"2017-05-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManager));","lastModifiedDate":"2017-05-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(null));","lastModifiedDate":"2017-05-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(5));","lastModifiedDate":"2017-05-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":" // different addressBook -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(differentAddressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // different filteredList -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":120,"author":{"gitId":"Wyrkx"},"content":" String[] keywords \u003d TypicalPersons.ALICE.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(keywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" // resets modelManager to initial state for upcoming tests","lastModifiedDate":"2017-08-05"},{"lineNumber":125,"author":{"gitId":"Wyrkx"},"content":" modelManager.updateFilteredPersonList(Model.PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // different userPrefs -\u003e returns false","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" UserPrefs differentUserPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":" differentUserPrefs.setAddressBookFilePath(Paths.get(\"differentFilePath\"));","lastModifiedDate":"2018-08-09"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, differentUserPrefs)));","lastModifiedDate":"2018-11-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-31"}],"authorContributionMap":{"Wyrkx":21,"-":111}},{"path":"src/test/java/tutorpro/model/UserPrefsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class UserPrefsTest {","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" UserPrefs userPref \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e userPref.setGuiSettings(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e userPrefs.setAddressBookFilePath(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-11-27"}],"authorContributionMap":{"Wyrkx":5,"-":17}},{"path":"src/test/java/tutorpro/model/person/AddressTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class AddressTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Address(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidAddress_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String invalidAddress \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Address(invalidAddress));","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void isValidAddress() {","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // null address","lastModifiedDate":"2017-12-04"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Address.isValidAddress(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // invalid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Address.isValidAddress(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Address.isValidAddress(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // valid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"Blk 456, Den Road, #01-355\"));","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"-\")); // one character","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"Leng Inc; 1234 Market St; San Francisco CA 2349879; USA\")); // long address","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Address address \u003d new Address(\"Valid Address\");","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertTrue(address.equals(new Address(\"Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(address.equals(address));","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(address.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertFalse(address.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertFalse(address.equals(new Address(\"Other Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"Wyrkx":6,"-":51}},{"path":"src/test/java/tutorpro/model/person/EmailTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class EmailTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Email(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidEmail_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String invalidEmail \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Email(invalidEmail));","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void isValidEmail() {","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // null email","lastModifiedDate":"2017-12-04"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Email.isValidEmail(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // blank email","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // missing parts","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"@example.com\")); // missing local part","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjackexample.com\")); // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@\")); // missing domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // invalid parts","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@-\")); // invalid domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@exam_ple.com\")); // underscore in domain name","lastModifiedDate":"2018-02-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter jack@example.com\")); // spaces in local part","lastModifiedDate":"2017-04-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@exam ple.com\")); // spaces in domain name","lastModifiedDate":"2017-04-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\" peterjack@example.com\")); // leading space","lastModifiedDate":"2018-02-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com \")); // trailing space","lastModifiedDate":"2018-02-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@@example.com\")); // double \u0027@\u0027 symbol","lastModifiedDate":"2017-04-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter@jack@example.com\")); // \u0027@\u0027 symbol in local part","lastModifiedDate":"2017-04-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"-peterjack@example.com\")); // local part starts with a hyphen","lastModifiedDate":"2021-07-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack-@example.com\")); // local part ends with a hyphen","lastModifiedDate":"2021-07-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter..jack@example.com\")); // local part has two consecutive periods","lastModifiedDate":"2021-07-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example@com\")); // \u0027@\u0027 symbol in domain name","lastModifiedDate":"2017-04-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@.example.com\")); // domain name starts with a period","lastModifiedDate":"2018-02-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com.\")); // domain name ends with a period","lastModifiedDate":"2018-02-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@-example.com\")); // domain name starts with a hyphen","lastModifiedDate":"2018-02-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com-\")); // domain name ends with a hyphen","lastModifiedDate":"2018-02-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.c\")); // top level domain has less than two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // valid email","lastModifiedDate":"2017-01-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack_1190@example.com\")); // underscore in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack.1190@example.com\")); // period in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack+1190@example.com\")); // \u0027+\u0027 symbol in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack-1190@example.com\")); // hyphen in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"a@bc\")); // minimal","lastModifiedDate":"2018-02-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"test@localhost\")); // alphabets only","lastModifiedDate":"2017-01-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"123@145\")); // numeric local part and domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"a1+be.d@example1.com\")); // mixture of alphanumeric and special characters","lastModifiedDate":"2021-07-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"peter_jack@very-very-very-long-example.com\")); // long domain name","lastModifiedDate":"2018-02-09"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"if.you.dream.it_you.can.do.it@example.com\")); // long local part","lastModifiedDate":"2017-04-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"e1234567@u.nus.edu\")); // more than one period in domain","lastModifiedDate":"2021-07-20"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" Email email \u003d new Email(\"valid@email\");","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertTrue(email.equals(new Email(\"valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertTrue(email.equals(email));","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertFalse(email.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertFalse(email.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertFalse(email.equals(new Email(\"other.valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"Wyrkx":6,"-":83}},{"path":"src/test/java/tutorpro/model/person/NameContainsKeywordsPredicateTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicateTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" List\u003cString\u003e firstPredicateKeywordList \u003d Collections.singletonList(\"first\");","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" List\u003cString\u003e secondPredicateKeywordList \u003d Arrays.asList(\"first\", \"second\");","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d new NameContainsKeywordsPredicate(secondPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicateCopy \u003d new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicateCopy));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(1));","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(null));","lastModifiedDate":"2017-06-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(secondPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void test_nameContainsKeywords_returnsTrue() {","lastModifiedDate":"2017-08-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // One keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Collections.singletonList(\"Alice\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Multiple keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // Only one matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Bob\", \"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Carol\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // Mixed-case keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"aLIce\", \"bOB\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void test_nameDoesNotContainKeywords_returnsFalse() {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // Zero keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Collections.emptyList());","lastModifiedDate":"2017-06-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // Non-matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // Keywords match phone, email and address, but does not match name","lastModifiedDate":"2017-06-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"12345\", \"alice@email.com\", \"Main\", \"Street\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").withPhone(\"12345\")","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .withEmail(\"alice@email.com\").withAddress(\"Main Street\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d List.of(\"keyword1\", \"keyword2\");","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(keywords);","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" String expected \u003d NameContainsKeywordsPredicate.class.getCanonicalName() + \"{keywords\u003d\" + keywords + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertEquals(expected, predicate.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"Wyrkx":2,"-":83}},{"path":"src/test/java/tutorpro/model/person/NameTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class NameTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Name(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String invalidName \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Name(invalidName));","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void isValidName() {","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // null name","lastModifiedDate":"2017-12-04"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Name.isValidName(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"peter*\")); // contains non-alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // valid name","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"peter jack\")); // alphabets only","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"12345\")); // numbers only","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"peter the 2nd\")); // alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"Capital Tan\")); // with capital letters","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"David Roger Jackson Ray Jr 2nd\")); // long names","lastModifiedDate":"2017-01-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Name name \u003d new Name(\"Valid Name\");","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(name.equals(new Name(\"Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertTrue(name.equals(name));","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(name.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertFalse(name.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertFalse(name.equals(new Name(\"Other Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"Wyrkx":6,"-":55}},{"path":"src/test/java/tutorpro/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"public class PersonTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" public void isSamePerson() {","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.isSamePerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.isSamePerson(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" Person editedBob \u003d new PersonBuilder(TypicalPersons.BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.BOB.isSamePerson(editedBob));","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" editedBob \u003d new PersonBuilder(TypicalPersons.BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.BOB.isSamePerson(editedBob));","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" public void equals() {","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" Person aliceCopy \u003d new PersonBuilder(TypicalPersons.ALICE).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.equals(aliceCopy));","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.equals(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":" // different type -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(5));","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(TypicalPersons.BOB));","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" // different name -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"Wyrkx"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" // different email -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":" // different address -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"Wyrkx"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"Wyrkx"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"Wyrkx"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + TypicalPersons.ALICE.getName() + \", phone\u003d\" + TypicalPersons.ALICE.getPhone()","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"Wyrkx"},"content":" + \", email\u003d\" + TypicalPersons.ALICE.getEmail() + \", address\u003d\" + TypicalPersons.ALICE.getAddress() + \", tags\u003d\" + TypicalPersons.ALICE.getTags() + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(expected, TypicalPersons.ALICE.toString());","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":100}},{"path":"src/test/java/tutorpro/model/person/PhoneTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class PhoneTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Phone(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidPhone_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String invalidPhone \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Phone(invalidPhone));","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void isValidPhone() {","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // null phone number","lastModifiedDate":"2017-12-04"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Phone.isValidPhone(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // invalid phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"91\")); // less than 3 numbers","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"phone\")); // non-numeric","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"9011p041\")); // alphabets within digits","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"9312 1534\")); // spaces within digits","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // valid phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"911\")); // exactly 3 numbers","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"93121534\"));","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"124293842033123\")); // long phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Phone phone \u003d new Phone(\"999\");","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(new Phone(\"999\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(phone));","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(new Phone(\"995\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"Wyrkx":6,"-":55}},{"path":"src/test/java/tutorpro/model/person/UniquePersonListTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"public class UniquePersonListTest {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final UniquePersonList uniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void contains_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.contains(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void contains_personNotInList_returnsFalse() {","lastModifiedDate":"2018-08-08"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" assertFalse(uniquePersonList.contains(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void contains_personInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" assertTrue(uniquePersonList.contains(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void contains_personWithSameIdentityFieldsInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(uniquePersonList.contains(editedAlice));","lastModifiedDate":"2018-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void add_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.add(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void add_duplicatePerson_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.add(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void setPerson_nullTargetPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPerson(null, TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void setPerson_nullEditedPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPerson(TypicalPersons.ALICE, null));","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void setPerson_targetPersonNotInList_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList.setPerson(TypicalPersons.ALICE, TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonIsSamePerson_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.setPerson(TypicalPersons.ALICE, TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasSameIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-08"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.setPerson(TypicalPersons.ALICE, editedAlice);","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(editedAlice);","lastModifiedDate":"2018-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasDifferentIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.setPerson(TypicalPersons.ALICE, TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":101,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasNonUniqueIdentity_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.setPerson(TypicalPersons.ALICE, TypicalPersons.BOB));","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public void remove_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":114,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.remove(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void remove_personDoesNotExist_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":119,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList.remove(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public void remove_existingPerson_removesPerson() {","lastModifiedDate":"2018-08-08"},{"lineNumber":124,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":125,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.remove(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" public void setPersons_nullUniquePersonList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":132,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((UniquePersonList) null));","lastModifiedDate":"2024-03-11"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void setPersons_uniquePersonList_replacesOwnListWithProvidedUniquePersonList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":137,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":138,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":139,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":140,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(expectedUniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void setPersons_nullList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":146,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((List\u003cPerson\u003e) null));","lastModifiedDate":"2024-03-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void setPersons_list_replacesOwnListWithProvidedList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":151,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":152,"author":{"gitId":"Wyrkx"},"content":" List\u003cPerson\u003e personList \u003d Collections.singletonList(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(personList);","lastModifiedDate":"2018-08-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":155,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":159,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":" public void setPersons_listWithDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":161,"author":{"gitId":"Wyrkx"},"content":" List\u003cPerson\u003e listWithDuplicatePersons \u003d Arrays.asList(TypicalPersons.ALICE, TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":162,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.setPersons(listWithDuplicatePersons));","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void asUnmodifiableObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2018-04-05"},{"lineNumber":167,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, ()","lastModifiedDate":"2024-03-11"},{"lineNumber":168,"author":{"gitId":"-"},"content":" -\u003e uniquePersonList.asUnmodifiableObservableList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":171,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-24"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-24"},{"lineNumber":173,"author":{"gitId":"-"},"content":" assertEquals(uniquePersonList.asUnmodifiableObservableList().toString(), uniquePersonList.toString());","lastModifiedDate":"2019-02-24"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"Wyrkx":47,"-":128}},{"path":"src/test/java/tutorpro/model/tag/TagTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"public class TagTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Tag(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" public void constructor_invalidTagName_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" String invalidTagName \u003d \"\";","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Tag(invalidTagName));","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" public void isValidTagName() {","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" // null tag name","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Tag.isValidTagName(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":27}},{"path":"src/test/java/tutorpro/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_NAME \u003d TypicalPersons.BENSON.getName().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_PHONE \u003d TypicalPersons.BENSON.getPhone().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_EMAIL \u003d TypicalPersons.BENSON.getEmail().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_ADDRESS \u003d TypicalPersons.BENSON.getAddress().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d TypicalPersons.BENSON.getTags().stream()","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(TypicalPersons.BENSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(TypicalPersons.BENSON, person.toModelType());","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":30,"-":81}},{"path":"src/test/java/tutorpro/storage/JsonAddressBookStorageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorageTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"JsonAddressBookStorageTest\");","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void readAddressBook_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e readAddressBook(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private java.util.Optional\u003cReadOnlyAddressBook\u003e readAddressBook(String filePath) throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return new JsonAddressBookStorage(Paths.get(filePath)).readAddressBook(addToTestDataPathIfNotNull(filePath));","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) {","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return prefsFileInTestDataFolder !\u003d null","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder)","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void read_missingFile_emptyResult() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertFalse(readAddressBook(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void read_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e readAddressBook(\"notJsonFormatAddressBook.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void readAddressBook_invalidPersonAddressBook_throwDataLoadingException() {","lastModifiedDate":"2023-06-14"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e readAddressBook(\"invalidPersonAddressBook.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void readAddressBook_invalidAndValidPersonAddressBook_throwDataLoadingException() {","lastModifiedDate":"2023-06-14"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e readAddressBook(\"invalidAndValidPersonAddressBook.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void readAndSaveAddressBook_allInOrder_success() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" Path filePath \u003d testFolder.resolve(\"TempAddressBook.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" AddressBook original \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" JsonAddressBookStorage jsonAddressBookStorage \u003d new JsonAddressBookStorage(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // Save in new file and read back","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook readBack \u003d jsonAddressBookStorage.readAddressBook(filePath).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // Modify data, overwrite exiting file, and read back","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" original.addPerson(TypicalPersons.HOON);","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"Wyrkx"},"content":" original.removePerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" readBack \u003d jsonAddressBookStorage.readAddressBook(filePath).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" // Save and read without specifying file path","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":" original.addPerson(TypicalPersons.IDA);","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original); // file path not specified","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" readBack \u003d jsonAddressBookStorage.readAddressBook().get(); // file path not specified","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void saveAddressBook_nullAddressBook_throwsNullPointerException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e saveAddressBook(null, \"SomeFile.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Saves {@code addressBook} at the specified {@code filePath}.","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private void saveAddressBook(ReadOnlyAddressBook addressBook, String filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(Paths.get(filePath))","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" .saveAddressBook(addressBook, addToTestDataPathIfNotNull(filePath));","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" throw new AssertionError(\"There should not be an error writing to the file.\", ioe);","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void saveAddressBook_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e saveAddressBook(new AddressBook(), null));","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":17,"-":91}},{"path":"src/test/java/tutorpro/storage/JsonSerializableAddressBookTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.JsonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class JsonSerializableAddressBookTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"JsonSerializableAddressBookTest\");","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final Path TYPICAL_PERSONS_FILE \u003d TEST_DATA_FOLDER.resolve(\"typicalPersonsAddressBook.json\");","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path INVALID_PERSON_FILE \u003d TEST_DATA_FOLDER.resolve(\"invalidPersonAddressBook.json\");","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Path DUPLICATE_PERSON_FILE \u003d TEST_DATA_FOLDER.resolve(\"duplicatePersonAddressBook.json\");","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void toModelType_typicalPersonsFile_success() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(TYPICAL_PERSONS_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" AddressBook addressBookFromFile \u003d dataFromFile.toModelType();","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" AddressBook typicalPersonsAddressBook \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertEquals(addressBookFromFile, typicalPersonsAddressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public void toModelType_invalidPersonFile_throwsIllegalValueException() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(INVALID_PERSON_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, dataFromFile::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void toModelType_duplicatePersons_throwsIllegalValueException() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(DUPLICATE_PERSON_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, JsonSerializableAddressBook.MESSAGE_DUPLICATE_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"-"},"content":" dataFromFile::toModelType);","lastModifiedDate":"2019-03-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":9,"-":39}},{"path":"src/test/java/tutorpro/storage/JsonUserPrefsStorageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonUserPrefsStorageTest {","lastModifiedDate":"2016-10-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"JsonUserPrefsStorageTest\");","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void readUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e readUserPrefs(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Optional\u003cUserPrefs\u003e readUserPrefs(String userPrefsFileInTestDataFolder) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":" Path prefsFilePath \u003d addToTestDataPathIfNotNull(userPrefsFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" return new JsonUserPrefsStorage(prefsFilePath).readUserPrefs(prefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void readUserPrefs_missingFile_emptyResult() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(readUserPrefs(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2016-09-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void readUserPrefs_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e readUserPrefs(\"NotJsonFormatUserPrefs.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String userPrefsFileInTestDataFolder) {","lastModifiedDate":"2018-04-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return userPrefsFileInTestDataFolder !\u003d null","lastModifiedDate":"2016-09-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(userPrefsFileInTestDataFolder)","lastModifiedDate":"2018-04-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2016-09-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void readUserPrefs_fileInOrder_successfullyRead() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":55,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"TypicalUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void readUserPrefs_valuesMissingFromFile_defaultValuesUsed() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"EmptyUserPrefs.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void readUserPrefs_extraValuesInFile_extraValuesIgnored() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"ExtraValuesUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private UserPrefs getTypicalUserPrefs() {","lastModifiedDate":"2017-02-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1000, 500, 300, 100));","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"addressbook.json\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return userPrefs;","lastModifiedDate":"2017-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void savePrefs_nullPrefs_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e saveUserPrefs(null, \"SomeFile.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void saveUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e saveUserPrefs(new UserPrefs(), null));","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-15"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Saves {@code userPrefs} at the specified {@code prefsFileInTestDataFolder} filepath.","lastModifiedDate":"2017-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-15"},{"lineNumber":94,"author":{"gitId":"-"},"content":" private void saveUserPrefs(UserPrefs userPrefs, String prefsFileInTestDataFolder) {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":96,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(addToTestDataPathIfNotNull(prefsFileInTestDataFolder))","lastModifiedDate":"2016-10-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":" .saveUserPrefs(userPrefs);","lastModifiedDate":"2016-10-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" throw new AssertionError(\"There should not be an error writing to the file\", ioe);","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public void saveUserPrefs_allInOrder_success() throws DataLoadingException, IOException {","lastModifiedDate":"2023-06-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" UserPrefs original \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(1200, 200, 0, 2));","lastModifiedDate":"2018-11-27"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Path pefsFilePath \u003d testFolder.resolve(\"TempPrefs.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":110,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage jsonUserPrefsStorage \u003d new JsonUserPrefsStorage(pefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" //Try writing when the file doesn\u0027t exist","lastModifiedDate":"2016-09-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":114,"author":{"gitId":"-"},"content":" UserPrefs readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":" //Try saving when the file exists","lastModifiedDate":"2016-09-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(5, 5, 5, 5));","lastModifiedDate":"2018-11-27"},{"lineNumber":119,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":120,"author":{"gitId":"-"},"content":" readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":121,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":10,"-":114}},{"path":"src/test/java/tutorpro/storage/StorageManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class StorageManagerTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private StorageManager storageManager;","lastModifiedDate":"2017-04-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2016-10-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(getTempFilePath(\"ab\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(getTempFilePath(\"prefs\"));","lastModifiedDate":"2017-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" storageManager \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2017-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Path getTempFilePath(String fileName) {","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return testFolder.resolve(fileName);","lastModifiedDate":"2019-04-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void prefsReadSave() throws Exception {","lastModifiedDate":"2016-10-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-09-28"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Note: This is an integration test that verifies the StorageManager is properly wired to the","lastModifiedDate":"2016-09-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * {@link JsonUserPrefsStorage} class.","lastModifiedDate":"2016-10-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * More extensive testing of UserPref saving/reading is done in {@link JsonUserPrefsStorageTest} class.","lastModifiedDate":"2016-10-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":" UserPrefs original \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(300, 600, 4, 6));","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" storageManager.saveUserPrefs(original);","lastModifiedDate":"2016-09-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs retrieved \u003d storageManager.readUserPrefs().get();","lastModifiedDate":"2016-09-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertEquals(original, retrieved);","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void addressBookReadSave() throws Exception {","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Note: This is an integration test that verifies the StorageManager is properly wired to the","lastModifiedDate":"2016-10-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * {@link JsonAddressBookStorage} class.","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * More extensive testing of UserPref saving/reading is done in {@link JsonAddressBookStorageTest} class.","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" AddressBook original \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"-"},"content":" storageManager.saveAddressBook(original);","lastModifiedDate":"2016-09-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook retrieved \u003d storageManager.readAddressBook().get();","lastModifiedDate":"2016-09-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(retrieved));","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void getAddressBookFilePath() {","lastModifiedDate":"2016-10-01"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertNotNull(storageManager.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":7,"-":61}},{"path":"src/test/java/tutorpro/testutil/AddressBookBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * A utility class to help with building Addressbook objects.","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Example usage: \u003cbr\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * {@code AddressBook ab \u003d new AddressBookBuilder().withPerson(\"John\", \"Doe\").build();}","lastModifiedDate":"2018-03-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AddressBookBuilder {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private AddressBook addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public AddressBookBuilder() {","lastModifiedDate":"2017-05-31"},{"lineNumber":16,"author":{"gitId":"-"},"content":" addressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public AddressBookBuilder(AddressBook addressBook) {","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" this.addressBook \u003d addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Adds a new {@code Person} to the {@code AddressBook} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public AddressBookBuilder withPerson(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2016-09-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddressBook build() {","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":3,"-":31}},{"path":"src/test/java/tutorpro/testutil/Assert.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2019-03-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.function.Executable;","lastModifiedDate":"2019-03-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-03-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-17"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * A set of assertion methods useful for writing tests.","lastModifiedDate":"2017-07-17"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class Assert {","lastModifiedDate":"2017-07-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Asserts that the {@code executable} throws the {@code expectedType} Exception.","lastModifiedDate":"2019-03-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * This is a wrapper method that invokes {@link Assertions#assertThrows(Class, Executable)}, to maintain consistency","lastModifiedDate":"2019-03-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * with our custom {@link #assertThrows(Class, String, Executable)} method.","lastModifiedDate":"2019-03-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * To standardize API calls in this project, users should use this method instead of","lastModifiedDate":"2019-03-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * {@link Assertions#assertThrows(Class, Executable)}.","lastModifiedDate":"2019-03-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static void assertThrows(Class\u003c? extends Throwable\u003e expectedType, Executable executable) {","lastModifiedDate":"2019-03-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Assertions.assertThrows(expectedType, executable);","lastModifiedDate":"2019-03-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-02-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-02-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-02-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Asserts that the {@code executable} throws the {@code expectedType} Exception with the {@code expectedMessage}.","lastModifiedDate":"2019-03-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * If there\u0027s no need for the verification of the exception\u0027s error message, call","lastModifiedDate":"2018-02-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * {@link #assertThrows(Class, Executable)} instead.","lastModifiedDate":"2019-03-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-03-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @see #assertThrows(Class, Executable)","lastModifiedDate":"2019-03-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-02-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static void assertThrows(Class\u003c? extends Throwable\u003e expectedType, String expectedMessage,","lastModifiedDate":"2019-03-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Executable executable) {","lastModifiedDate":"2019-03-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Throwable thrownException \u003d Assertions.assertThrows(expectedType, executable);","lastModifiedDate":"2019-03-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedMessage, thrownException.getMessage());","lastModifiedDate":"2019-03-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-17"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-17"}],"authorContributionMap":{"Wyrkx":1,"-":33}},{"path":"src/test/java/tutorpro/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" private EditCommand.EditPersonDescriptor descriptor;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" public EditPersonDescriptorBuilder(EditCommand.EditPersonDescriptor descriptor) {","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" this.descriptor \u003d new EditCommand.EditPersonDescriptor(descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" public EditCommand.EditPersonDescriptor build() {","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"Wyrkx":14,"-":73}},{"path":"src/test/java/tutorpro/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.util.SampleDataUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":84,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return new Person(name, phone, email, address, tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":96,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"Wyrkx":8,"-":88}},{"path":"src/test/java/tutorpro/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.CliSyntax;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"/**","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" * A utility class for Person.","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"public class PersonUtil {","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" s -\u003e sb.append(CliSyntax.PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" );","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" return sb.toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" public static String getEditPersonDescriptorDetails(EditCommand.EditPersonDescriptor descriptor) {","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(CliSyntax.PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(CliSyntax.PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(CliSyntax.PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(CliSyntax.PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_TAG);","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" } else {","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" tags.forEach(s -\u003e sb.append(CliSyntax.PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":" return sb.toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"Wyrkx":57}},{"path":"src/test/java/tutorpro/testutil/SerializableTestClass.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * A class used to test serialization and deserialization","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class SerializableTestClass {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String JSON_STRING_REPRESENTATION \u003d String.format(\"{%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \" \\\"name\\\" : \\\"This is a test class\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" + \" \\\"listOfLocalDateTimes\\\" : \"","lastModifiedDate":"2016-10-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \"[ \\\"-999999999-01-01T00:00:00\\\", \\\"+999999999-12-31T23:59:59.999999999\\\", \"","lastModifiedDate":"2016-10-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"\\\"0001-01-01T01:01:00\\\" ],%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \" \\\"mapOfIntegerToString\\\" : {%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \" \\\"1\\\" : \\\"One\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \" \\\"2\\\" : \\\"Two\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \" \\\"3\\\" : \\\"Three\\\"%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \" }%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \"}\");","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String NAME_TEST_VALUE \u003d \"This is a test class\";","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private String name;","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private List\u003cLocalDateTime\u003e listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private HashMap\u003cInteger, String\u003e mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static String getNameTestValue() {","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return NAME_TEST_VALUE;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static List\u003cLocalDateTime\u003e getListTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" List\u003cLocalDateTime\u003e listOfLocalDateTimes \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.MIN);","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.MAX);","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.of(1, 1, 1, 1, 1));","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static HashMap\u003cInteger, String\u003e getHashMapTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" HashMap\u003cInteger, String\u003e mapOfIntegerToString \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(1, \"One\");","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(2, \"Two\");","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(3, \"Three\");","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void setTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" name \u003d getNameTestValue();","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" listOfLocalDateTimes \u003d getListTestValues();","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" mapOfIntegerToString \u003d getHashMapTestValues();","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public String getName() {","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public List\u003cLocalDateTime\u003e getListOfLocalDateTimes() {","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public HashMap\u003cInteger, String\u003e getMapOfIntegerToString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":71}},{"path":"src/test/java/tutorpro/testutil/TestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * A utility class for test cases.","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class TestUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Folder used for temp files created during testing. Ignored by Git.","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final Path SANDBOX_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"sandbox\");","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Appends {@code fileName} to the sandbox folder path and returns the resulting path.","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates the sandbox folder if it doesn\u0027t exist.","lastModifiedDate":"2016-09-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static Path getFilePathInSandboxFolder(String fileName) {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Files.createDirectories(SANDBOX_FOLDER);","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":" throw new RuntimeException(e);","lastModifiedDate":"2016-09-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return SANDBOX_FOLDER.resolve(fileName);","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Returns the middle index of the person in the {@code model}\u0027s person list.","lastModifiedDate":"2017-07-30"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static Index getMidIndex(Model model) {","lastModifiedDate":"2017-07-30"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return Index.fromOneBased(model.getFilteredPersonList().size() / 2);","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Returns the last index of the person in the {@code model}\u0027s person list.","lastModifiedDate":"2017-07-30"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static Index getLastIndex(Model model) {","lastModifiedDate":"2017-07-30"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-30"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns the person in the {@code model}\u0027s person list at {@code index}.","lastModifiedDate":"2017-07-30"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static Person getPerson(Model model, Index index) {","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return model.getFilteredPersonList().get(index.getZeroBased());","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":4,"-":51}},{"path":"src/test/java/tutorpro/testutil/TypicalIndexes.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Index} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class TypicalIndexes {","lastModifiedDate":"2017-08-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Index INDEX_FIRST_PERSON \u003d Index.fromOneBased(1);","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Index INDEX_SECOND_PERSON \u003d Index.fromOneBased(2);","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Index INDEX_THIRD_PERSON \u003d Index.fromOneBased(3);","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-08-05"}],"authorContributionMap":{"Wyrkx":2,"-":10}},{"path":"src/test/java/tutorpro/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2017-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .withEmail(\"heinz@example.com\").withAddress(\"wall street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withEmail(\"cornelia@example.com\").withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2018-03-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .withEmail(\"werner@example.com\").withAddress(\"michegan ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .withEmail(\"lydia@example.com\").withAddress(\"little tokyo\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .withEmail(\"anna@example.com\").withAddress(\"4th street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .withEmail(\"stefan@example.com\").withAddress(\"little india\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .withEmail(\"hans@example.com\").withAddress(\"chicago ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2017-09-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":68,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":76,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"Wyrkx":13,"-":63}},{"path":"src/test/java/tutorpro/ui/TestFxmlObject.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.beans.DefaultProperty;","lastModifiedDate":"2016-12-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * A test object which can be constructed via an FXML file.","lastModifiedDate":"2016-12-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Unlike other JavaFX classes, this class can be constructed without the JavaFX toolkit being initialized.","lastModifiedDate":"2016-12-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"@DefaultProperty(\"text\")","lastModifiedDate":"2016-12-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class TestFxmlObject {","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private String text;","lastModifiedDate":"2016-12-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public TestFxmlObject() {}","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public TestFxmlObject(String text) {","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" setText(text);","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public String getText() {","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return text;","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setText(String text) {","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.text \u003d text;","lastModifiedDate":"2016-12-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" if (!(other instanceof TestFxmlObject)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" TestFxmlObject otherTestFxmlObject \u003d (TestFxmlObject) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return Objects.equals(text, otherTestFxmlObject.text);","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"Wyrkx":1,"-":44}},{"path":"src/test/java/tutorpro/ui/UiPartTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.net.URL;","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2019-04-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class UiPartTest {","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String MISSING_FILE_PATH \u003d \"UiPartTest/missingFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String INVALID_FILE_PATH \u003d \"UiPartTest/invalidFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String VALID_FILE_PATH \u003d \"UiPartTest/validFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String VALID_FILE_WITH_FX_ROOT_PATH \u003d \"UiPartTest/validFileWithFxRoot.fxml\";","lastModifiedDate":"2017-11-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final TestFxmlObject VALID_FILE_ROOT \u003d new TestFxmlObject(\"Hello World!\");","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void constructor_nullFileUrl_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((URL) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((URL) null, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public void constructor_missingFileUrl_throwsAssertionError() throws Exception {","lastModifiedDate":"2016-12-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" URL missingFileUrl \u003d new URL(testFolder.toUri().toURL(), MISSING_FILE_PATH);","lastModifiedDate":"2019-04-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(missingFileUrl));","lastModifiedDate":"2019-03-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(missingFileUrl, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void constructor_invalidFileUrl_throwsAssertionError() {","lastModifiedDate":"2016-12-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" URL invalidFileUrl \u003d getTestFileUrl(INVALID_FILE_PATH);","lastModifiedDate":"2016-12-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(invalidFileUrl));","lastModifiedDate":"2019-03-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(invalidFileUrl, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void constructor_validFileUrl_loadsFile() {","lastModifiedDate":"2016-12-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" URL validFileUrl \u003d getTestFileUrl(VALID_FILE_PATH);","lastModifiedDate":"2016-12-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, new TestUiPart\u003cTestFxmlObject\u003e(validFileUrl).getRoot());","lastModifiedDate":"2016-12-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-11-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void constructor_validFileWithFxRootUrl_loadsFile() {","lastModifiedDate":"2017-11-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" URL validFileUrl \u003d getTestFileUrl(VALID_FILE_WITH_FX_ROOT_PATH);","lastModifiedDate":"2017-11-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":" TestFxmlObject root \u003d new TestFxmlObject();","lastModifiedDate":"2017-11-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, new TestUiPart\u003cTestFxmlObject\u003e(validFileUrl, root).getRoot());","lastModifiedDate":"2017-11-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void constructor_nullFileName_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((String) null, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void constructor_missingFileName_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e(MISSING_FILE_PATH));","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e(MISSING_FILE_PATH, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void constructor_invalidFileName_throwsAssertionError() {","lastModifiedDate":"2016-12-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(INVALID_FILE_PATH));","lastModifiedDate":"2019-03-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(INVALID_FILE_PATH, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":" private URL getTestFileUrl(String testFilePath) {","lastModifiedDate":"2016-12-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String testFilePathInView \u003d \"/view/\" + testFilePath;","lastModifiedDate":"2016-12-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" URL testFileUrl \u003d MainApp.class.getResource(testFilePathInView);","lastModifiedDate":"2016-12-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertNotNull(testFileUrl, testFilePathInView + \" does not exist.\");","lastModifiedDate":"2019-03-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return testFileUrl;","lastModifiedDate":"2016-12-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * UiPart used for testing.","lastModifiedDate":"2016-12-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * It should only be used with invalid FXML files or the valid file located at {@link VALID_FILE_PATH}.","lastModifiedDate":"2016-12-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" private static class TestUiPart\u003cT\u003e extends UiPart\u003cT\u003e {","lastModifiedDate":"2016-12-21"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private TestFxmlObject validFileRoot; // Check that @FXML annotations work","lastModifiedDate":"2016-12-21"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":94,"author":{"gitId":"-"},"content":" TestUiPart(URL fxmlFileUrl, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":" super(fxmlFileUrl, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":" TestUiPart(String fxmlFileName, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":" super(fxmlFileName, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":" TestUiPart(URL fxmlFileUrl) {","lastModifiedDate":"2016-12-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":" super(fxmlFileUrl);","lastModifiedDate":"2016-12-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, validFileRoot);","lastModifiedDate":"2016-12-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":107,"author":{"gitId":"-"},"content":" TestUiPart(String fxmlFileName) {","lastModifiedDate":"2016-12-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":" super(fxmlFileName);","lastModifiedDate":"2016-12-21"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, validFileRoot);","lastModifiedDate":"2016-12-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"Wyrkx":3,"-":111}},{"path":"src/test/resources/view/UiPartTest/validFile.fxml","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2016-12-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"\u003c?import tutorpro.ui.TestFxmlObject?\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003cTestFxmlObject xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:id\u003d\"validFileRoot\"\u003eHello World!\u003c/TestFxmlObject\u003e","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"Wyrkx":1,"-":3}},{"path":"src/test/resources/view/UiPartTest/validFileWithFxRoot.fxml","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2017-11-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"\u003cfx:root type\u003d\"TestFxmlObject\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2023-07-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003ctext\u003eHello World!\u003c/text\u003e","lastModifiedDate":"2017-11-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2017-11-29"}],"authorContributionMap":{"Wyrkx":1,"-":5}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"agreatdayy"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"\u003c!--- [![codecov badge](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)---\u003e","lastModifiedDate":"2024-03-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-23"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"![MockUi](docs/images/mockUI.png)","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"* This is **a CS2103T project by NUS Computing students**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"* The project simulates an ongoing software project for a desktop application (called _TutorPro_) used by private tutors for managing their students. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"* It is named `TutorPro Level 1` (`TP-1` for short) because it was initially created as a part of a series of `TutorPro` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"* For the detailed documentation of this project, see the **[tutorpro.github.io](https://ay2324s2-cs2103t-f12-3.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"agreatdayy"},"content":"* This project is based on the AddressBook-Level3 project created by the **[SE-EDU initiative](https://se-education.org)**. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"agreatdayy":8,"-":8}},{"path":"build.gradle","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"plugins {","lastModifiedDate":"2016-08-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":" id \u0027java\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":" id \u0027checkstyle\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" id \u0027com.github.johnrengelman.shadow\u0027 version \u00277.1.2\u0027","lastModifiedDate":"2022-06-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":" id \u0027application\u0027","lastModifiedDate":"2016-12-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":" id \u0027jacoco\u0027","lastModifiedDate":"2020-08-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"mainClassName \u003d \u0027address.Main\u0027","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"sourceCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"targetCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"repositories {","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" mavenCentral()","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" maven { url \u0027https://oss.sonatype.org/content/repositories/snapshots/\u0027 }","lastModifiedDate":"2018-04-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"checkstyle {","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" toolVersion \u003d \u002710.2\u0027","lastModifiedDate":"2022-04-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"test {","lastModifiedDate":"2018-03-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" useJUnitPlatform()","lastModifiedDate":"2018-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" finalizedBy jacocoTestReport","lastModifiedDate":"2020-08-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-08-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"task coverage(type: JacocoReport) {","lastModifiedDate":"2020-08-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":" sourceDirectories.from files(sourceSets.main.allSource.srcDirs)","lastModifiedDate":"2020-08-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" classDirectories.from files(sourceSets.main.output)","lastModifiedDate":"2020-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" executionData.from files(jacocoTestReport.executionData)","lastModifiedDate":"2020-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" afterEvaluate {","lastModifiedDate":"2020-08-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" classDirectories.from files(classDirectories.files.collect {","lastModifiedDate":"2020-08-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" fileTree(dir: it, exclude: [\u0027**/*.jar\u0027])","lastModifiedDate":"2020-08-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" })","lastModifiedDate":"2020-08-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" reports {","lastModifiedDate":"2020-08-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" html.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":" xml.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"dependencies {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String jUnitVersion \u003d \u00275.4.0\u0027","lastModifiedDate":"2019-02-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String javaFxVersion \u003d \u002717.0.7\u0027","lastModifiedDate":"2023-07-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":50,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.core\u0027, name: \u0027jackson-databind\u0027, version: \u00272.7.0\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.datatype\u0027, name: \u0027jackson-datatype-jsr310\u0027, version: \u00272.7.4\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" testImplementation group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-api\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" testRuntimeOnly group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-engine\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"shadowJar {","lastModifiedDate":"2016-08-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":" archiveFileName \u003d \u0027addressbook.jar\u0027","lastModifiedDate":"2022-06-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"defaultTasks \u0027clean\u0027, \u0027test\u0027","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"agreatdayy":1,"-":71}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"content":"You can reach us at the email [e0960433@u.nus.edu](e0960433@u.nus.edu)","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"### Carsten Joe Ng","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"\u003cimg src\u003d\"images/wyrkx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"[[github](http://github.com/wyrkx)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"[[portfolio](team/carsten.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"TarinPairor"},"content":"- Role: Team Lead","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"TarinPairor"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"TarinPairor"},"content":"### Pairor Tarin","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"agreatdayy"},"content":"\u003cimg src\u003d\"images/TarinPairor.png\" width\u003d\"199px\"\u003e","lastModifiedDate":"2024-03-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"TarinPairor"},"content":"[[github](http://github.com/TarinPairor)]","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"agreatdayy"},"content":"[[portfolio](team/tarinpairor.md)]","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"agreatdayy"},"content":"### Lee Xin Yuan","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"agreatdayy"},"content":"\u003cimg src\u003d\"images/agreatdayy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"agreatdayy"},"content":"[[github](http://github.com/agreatdayy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"agreatdayy"},"content":"[[portfolio](team/xinyuan.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"TarinPairor"},"content":"- Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"agreatdayy"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"tamagochuuu"},"content":"### Tee Chu Jie","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"agreatdayy"},"content":"\u003cimg src\u003d\"images/tamagochuuu.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"tamagochuuu"},"content":"[[github](https://github.com/tamagochuuu)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"tamagochuuu"},"content":"[[portfolio](team/chujie.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"tamagochuuu"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"tamagochuuu"},"content":"- Responsibilites: Dev Ops","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"agreatdayy":10,"Wyrkx":3,"TarinPairor":5,"-":24,"tamagochuuu":5}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who prefer CLI over GUI","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who go to tutees\u0027 houses and teach one-to-one","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who teach multiple subjects","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"tamagochuuu"},"content":"* Private tutors who teach multiple levels or a specific level, e.g. primary school students","lastModifiedDate":"2024-03-07"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"tamagochuuu"},"content":"**Value proposition**: Allows for easy track and management of tutees, e.g. grades, addresses, deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"tamagochuuu"},"content":"|----------|---------------|---------------------------------------------------------|----------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | track my tutee\u0027s grades, addresses and deadlines easily | efficiently manage my tutoring sessions |","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | input new tutees\u0027 progress seamlessly | add new tutees\u0027 information |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | delete previously created inputs | remove information that I no longer need |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"tamagochuuu"},"content":"| `* * *` | private tutor | track my project tasks and timelines seamlessly | effectively manage my workflow and deliver on time |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"tamagochuuu"},"content":"| `* *` | private tutor | set reminders for important deadlines and milestones | never miss a crucial event |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"tamagochuuu"},"content":"(For all use cases below, the **System** is `TutorPro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to add a specific student","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro adds the student","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The student has the same details as someone already in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to list students","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro shows a list of students","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"tamagochuuu"},"content":"3. User requests to delete a specific student in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"tamagochuuu"},"content":"4. TutorPro deletes the student","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"tamagochuuu"},"content":" * 3a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"tamagochuuu"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"tamagochuuu"},"content":"* 3b. The given student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"tamagochuuu"},"content":" * 3b1. TutorPro displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Find a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to find a specific student.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro displays a list of students whose details match the user input.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Update a student\u0027s progress/particulars**","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to update a specific student’s progress/particulars.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro updates the student’s progress/particulars.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays the updated information to the user for verification.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"tamagochuuu"},"content":"* 2b. The given category is not one of the available categories.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"tamagochuuu"},"content":" * 2b1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"tamagochuuu"},"content":"* 2c. Given new information to update does not match the input format for the particular category.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"tamagochuuu"},"content":" * 2c1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Setting a reminder**","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to set a reminder.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro sets the reminder.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays a list of currently scheduled reminders.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The given date or time is in an incorrect format.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Create a tag**","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to create a tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro creates the specified tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays a list of created tags.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified tag to create already exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Tag a student**","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to tag a student.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro tags the student.","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays the list of students who have the same tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The specified student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"tamagochuuu"},"content":"* 2b. The specified tag does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"tamagochuuu"},"content":" * 2b1. TutorPro displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Display the user\u0027s schedule**","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to display their current schedule.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro displays the user’s current schedule","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"tamagochuuu"},"content":"* 2a. The user has nothing in their schedule.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"tamagochuuu"},"content":"**Use case: Set a recurring event**","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"tamagochuuu"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"tamagochuuu"},"content":"1. The user requests to set an event that recurs weekly.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"tamagochuuu"},"content":"2. TutorPro sets the event.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"tamagochuuu"},"content":"3. TutorPro displays the list of the user’s weekly recurring events.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"tamagochuuu"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"tamagochuuu"},"content":"* 2a. Given day(s) is/are in the wrong input format.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"tamagochuuu"},"content":" * 2a1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"tamagochuuu"},"content":"* 2b. Given student does not exist in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"tamagochuuu"},"content":" * 2b1. TutorPro shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"tamagochuuu"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"tamagochuuu"},"content":"1. Security:","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"tamagochuuu"},"content":"* The application must ensure secure storage and transmission of sensitive student data, such as grades and contact information, adhering to industry-standard _encryption_ protocols.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"tamagochuuu"},"content":"* Access to student records must be restricted to authorized users only, with role-based access control mechanisms in place.","lastModifiedDate":"2024-03-07"},{"lineNumber":481,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":482,"author":{"gitId":"tamagochuuu"},"content":"2. Privacy:","lastModifiedDate":"2024-03-07"},{"lineNumber":483,"author":{"gitId":"tamagochuuu"},"content":"* The application should comply with relevant privacy regulations (e.g., GDPR, HIPAA) to safeguard students\u0027 personal information.","lastModifiedDate":"2024-03-07"},{"lineNumber":484,"author":{"gitId":"tamagochuuu"},"content":"* Student data should only be accessible to the student, their assigned tutor, and authorized administrative staff.","lastModifiedDate":"2024-03-07"},{"lineNumber":485,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":486,"author":{"gitId":"tamagochuuu"},"content":"3. Scalability:","lastModifiedDate":"2024-03-07"},{"lineNumber":487,"author":{"gitId":"tamagochuuu"},"content":"* The system must be able to handle a growing number of students and tutors without a significant decrease in performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"tamagochuuu"},"content":"* It should support concurrent access by multiple users without degradation in response time or system stability.","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":490,"author":{"gitId":"tamagochuuu"},"content":"4. Reliability:","lastModifiedDate":"2024-03-07"},{"lineNumber":491,"author":{"gitId":"tamagochuuu"},"content":"* The application should have minimal downtime and be available for use during critical academic periods, such as exam periods or assignment deadlines.","lastModifiedDate":"2024-03-07"},{"lineNumber":492,"author":{"gitId":"tamagochuuu"},"content":"* It should have mechanisms in place to recover from failures gracefully, ensuring _data integrity_ and continuity of service.","lastModifiedDate":"2024-03-07"},{"lineNumber":493,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":494,"author":{"gitId":"tamagochuuu"},"content":"5. Interoperability:","lastModifiedDate":"2024-03-07"},{"lineNumber":495,"author":{"gitId":"tamagochuuu"},"content":"* The application should be compatible with various devices and _operating systems_ commonly used by both tutors and students, such as laptops, tablets, and smartphones.","lastModifiedDate":"2024-03-07"},{"lineNumber":496,"author":{"gitId":"tamagochuuu"},"content":"* It should support integration with other academic systems or tools, such as learning management systems or scheduling software.","lastModifiedDate":"2024-03-07"},{"lineNumber":497,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":498,"author":{"gitId":"tamagochuuu"},"content":"6. Usability:","lastModifiedDate":"2024-03-07"},{"lineNumber":499,"author":{"gitId":"tamagochuuu"},"content":"* The application interface should be intuitive and user-friendly, requiring minimal training for tutors and students to navigate and use effectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":500,"author":{"gitId":"tamagochuuu"},"content":"* It should provide clear instructions and guidance for inputting and accessing academic information and contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":501,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":502,"author":{"gitId":"tamagochuuu"},"content":"7. Performance:","lastModifiedDate":"2024-03-07"},{"lineNumber":503,"author":{"gitId":"tamagochuuu"},"content":"* The system should respond promptly to user actions, such as loading student profiles, updating grades, or scheduling tutoring sessions, aiming for sub-second response times.","lastModifiedDate":"2024-03-07"},{"lineNumber":504,"author":{"gitId":"tamagochuuu"},"content":"* It should efficiently manage database queries and data retrieval to prevent delays in accessing information.","lastModifiedDate":"2024-03-07"},{"lineNumber":505,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":506,"author":{"gitId":"tamagochuuu"},"content":"8. Maintainability:","lastModifiedDate":"2024-03-07"},{"lineNumber":507,"author":{"gitId":"tamagochuuu"},"content":"* The application codebase should be well-documented and _modular_, facilitating ease of maintenance and future enhancements.","lastModifiedDate":"2024-03-07"},{"lineNumber":508,"author":{"gitId":"tamagochuuu"},"content":"* It should support version control and have mechanisms for bug tracking and resolution.","lastModifiedDate":"2024-03-07"},{"lineNumber":509,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":510,"author":{"gitId":"tamagochuuu"},"content":"9. Accessibility:","lastModifiedDate":"2024-03-07"},{"lineNumber":511,"author":{"gitId":"tamagochuuu"},"content":"* The application interface should be accessible to users with disabilities, following web accessibility guidelines such as WCAG.","lastModifiedDate":"2024-03-07"},{"lineNumber":512,"author":{"gitId":"tamagochuuu"},"content":"* It should support alternative input methods, screen readers, and keyboard navigation for users with visual or motor impairments.","lastModifiedDate":"2024-03-07"},{"lineNumber":513,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":514,"author":{"gitId":"tamagochuuu"},"content":"10. Backup and Disaster Recovery:","lastModifiedDate":"2024-03-07"},{"lineNumber":515,"author":{"gitId":"tamagochuuu"},"content":"* Regular backups of student data should be performed, with procedures in place for data restoration in case of accidental deletion or system failure.","lastModifiedDate":"2024-03-07"},{"lineNumber":516,"author":{"gitId":"tamagochuuu"},"content":"* The application should have disaster recovery measures to ensure minimal data loss and service disruption in the event of server or infrastructure failures.","lastModifiedDate":"2024-03-07"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"tamagochuuu"},"content":"* **Encryption** - The process of converting information or data into a code, especially to prevent unauthorized access.","lastModifiedDate":"2024-03-07"},{"lineNumber":522,"author":{"gitId":"tamagochuuu"},"content":"* **Data integrity** - The accuracy, completeness, and quality of data as it’s maintained over time and across formats.","lastModifiedDate":"2024-03-07"},{"lineNumber":523,"author":{"gitId":"tamagochuuu"},"content":"* **Operating system** - Mainstream operating systems are: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-07"},{"lineNumber":524,"author":{"gitId":"tamagochuuu"},"content":"* **Modular** - By modularizing a codebase you will define more clear boundaries between different clusters of objects that make up a screen of feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":357,"tamagochuuu":220}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"title: TutorPro Level-1","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"![mockUi](images/mockUI.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"**TutorPro is a desktop application for managing your students\u0027 details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":"* If you are interested in using TutorPro, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"* If you are interested about developing TutorPro, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"agreatdayy"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"agreatdayy":7,"-":13}},{"path":"docs/team/carsten.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"title: Carsten\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"### Project: TutorPro Level 1","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"TutorPro - Level 1 is a desktop contact management application used for managing students as a **Private Tutor**. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" * README:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Wyrkx":33}},{"path":"docs/team/chujie.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tamagochuuu"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"tamagochuuu"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"tamagochuuu"},"content":"title: Chu Jie\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tamagochuuu"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"tamagochuuu"},"content":"### Project: TutorPro Level 1","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"tamagochuuu"},"content":"TutorPro - Level 1 is a desktop contact management application used for managing students as a **Private Tutor**. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"tamagochuuu"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"tamagochuuu"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"tamagochuuu"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"tamagochuuu"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"tamagochuuu"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"tamagochuuu"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"tamagochuuu"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"tamagochuuu"},"content":" *","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"tamagochuuu"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"tamagochuuu"},"content":" * README:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"tamagochuuu"},"content":" * Updated our Developer Guide.","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"tamagochuuu"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"tamagochuuu"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"tamagochuuu"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"tamagochuuu"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"tamagochuuu"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"tamagochuuu"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tamagochuuu":33}},{"path":"docs/team/tarinpairor.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"agreatdayy"},"content":"layout: page","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"TarinPairor"},"content":"title: Pairor Tarin\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-12"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"TarinPairor"},"content":"### Project: TutorPro Level 1","lastModifiedDate":"2024-03-12"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"TarinPairor"},"content":"TutorPro - Level 1 is a desktop contact management application used for managing students as a **Private Tutor**. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-12"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"TarinPairor"},"content":"- **New Feature**:","lastModifiedDate":"2024-03-12"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"TarinPairor"},"content":"- **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-12"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"TarinPairor"},"content":"- **Project management**:","lastModifiedDate":"2024-03-12"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"TarinPairor"},"content":"- **Enhancements to existing features**:","lastModifiedDate":"2024-03-12"},{"lineNumber":19,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"TarinPairor"},"content":"- **Documentation**:","lastModifiedDate":"2024-03-12"},{"lineNumber":21,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"TarinPairor"},"content":" - README:","lastModifiedDate":"2024-03-12"},{"lineNumber":23,"author":{"gitId":"TarinPairor"},"content":" - Made UI mockup of our intended final product.","lastModifiedDate":"2024-03-12"},{"lineNumber":24,"author":{"gitId":"TarinPairor"},"content":" - Update all contents to match our project.","lastModifiedDate":"2024-03-12"},{"lineNumber":25,"author":{"gitId":"TarinPairor"},"content":" - Acknowledge the original source of the code.","lastModifiedDate":"2024-03-12"},{"lineNumber":26,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"TarinPairor"},"content":"- **Community**:","lastModifiedDate":"2024-03-12"},{"lineNumber":28,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"TarinPairor"},"content":" - PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-12"},{"lineNumber":30,"author":{"gitId":"TarinPairor"},"content":" - Contributed to forum discussions (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-12"},{"lineNumber":31,"author":{"gitId":"TarinPairor"},"content":" - Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-12"},{"lineNumber":32,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"TarinPairor"},"content":"- _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-12"}],"authorContributionMap":{"agreatdayy":16,"TarinPairor":17}},{"path":"docs/team/xinyuan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"agreatdayy"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"title: Xin Yuan\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"### Project: TutorPro Level 1","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"content":"TutorPro - Level 1 is a desktop contact management application used for managing students as a **Private Tutor**. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"agreatdayy"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":19,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"agreatdayy"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-09"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"agreatdayy"},"content":" * README:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"agreatdayy"},"content":" * Made UI mockup of our intended final product.","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"agreatdayy"},"content":" * Update all contents to match our project.","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"agreatdayy"},"content":" * Acknowledge the original source of the code.","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"agreatdayy"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"agreatdayy"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"agreatdayy"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-12"},{"lineNumber":32,"author":{"gitId":"agreatdayy"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"agreatdayy"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"agreatdayy":31,"Wyrkx":3}},{"path":"src/main/java/tutorpro/AppParameters.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.FileUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Represents the parsed command-line parameters given to the application.","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class AppParameters {","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AppParameters.class);","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Path configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public Path getConfigPath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setConfigPath(Path configPath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.configPath \u003d configPath;","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Parses the application command-line parameters.","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static AppParameters parse(Application.Parameters parameters) {","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" Map\u003cString, String\u003e namedParameters \u003d parameters.getNamed();","lastModifiedDate":"2018-04-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" String configPathParameter \u003d namedParameters.get(\"config\");","lastModifiedDate":"2018-04-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (configPathParameter !\u003d null \u0026\u0026 !FileUtil.isValidPath(configPathParameter)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" logger.warning(\"Invalid config path \" + configPathParameter + \". Using default config path.\");","lastModifiedDate":"2018-04-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" configPathParameter \u003d null;","lastModifiedDate":"2018-04-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" appParameters.setConfigPath(configPathParameter !\u003d null ? Paths.get(configPathParameter) : null);","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return appParameters;","lastModifiedDate":"2018-04-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-04-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (!(other instanceof AppParameters)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" AppParameters otherAppParameters \u003d (AppParameters) other;","lastModifiedDate":"2018-04-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return Objects.equals(configPath, otherAppParameters.configPath);","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return configPath.hashCode();","lastModifiedDate":"2018-04-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .add(\"configPath\", configPath)","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-04-21"}],"authorContributionMap":{"Wyrkx":4,"-":69}},{"path":"src/main/java/tutorpro/Main.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2019-02-08"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2019-02-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * The main entry point to the application.","lastModifiedDate":"2019-02-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * This is a workaround for the following error when MainApp is made the","lastModifiedDate":"2019-02-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * entry point of the application:","lastModifiedDate":"2019-02-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Error: JavaFX runtime components are missing, and are required to run this application","lastModifiedDate":"2019-02-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The reason is that MainApp extends Application. In that case, the","lastModifiedDate":"2019-02-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * LauncherHelper will check for the javafx.graphics module to be present","lastModifiedDate":"2019-02-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * as a named module. We don\u0027t use JavaFX via the module system so it can\u0027t","lastModifiedDate":"2019-02-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * find the javafx.graphics module, and so the launch is aborted.","lastModifiedDate":"2019-02-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * By having a separate main class (Main) that doesn\u0027t extend Application","lastModifiedDate":"2019-02-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * to be the entry point of the application, we avoid this issue.","lastModifiedDate":"2019-02-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class Main {","lastModifiedDate":"2019-02-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static Logger logger \u003d LogsCenter.getLogger(Main.class);","lastModifiedDate":"2023-07-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static void main(String[] args) {","lastModifiedDate":"2019-02-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // As per https://github.com/openjdk/jfx/blob/master/doc-files/release-notes-16.md","lastModifiedDate":"2023-07-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // JavaFX 16 (or later) runtime logs a warning at startup if JavaFX classes are loaded from","lastModifiedDate":"2023-07-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // the classpath instead of a module.","lastModifiedDate":"2023-07-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // Our application does not use Java modules yet. Even if it did, modules are ignored when","lastModifiedDate":"2023-07-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // packed into a FAT Jar file (as we do), which means this warning will persist even then.","lastModifiedDate":"2023-07-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // The warning however, can be safely ignored. Thus, the following log informs","lastModifiedDate":"2023-07-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // the user (if looking at the log output) that the said warning appearing in the log","lastModifiedDate":"2023-07-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // can be ignored.","lastModifiedDate":"2023-07-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-27"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" if (!(args instanceof String[])) {","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" ;","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" logger.warning(\"The warning about Unsupported JavaFX configuration below can be ignored.\");","lastModifiedDate":"2023-07-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Application.launch(MainApp.class, args);","lastModifiedDate":"2019-02-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-08"}],"authorContributionMap":{"Wyrkx":5,"-":39}},{"path":"src/main/java/tutorpro/MainApp.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2016-08-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-26"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Config;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Version;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ConfigUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.LogicManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.util.SampleDataUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.AddressBookStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonAddressBookStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonUserPrefsStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.Storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.StorageManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.UserPrefsStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.ui.Ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.ui.UiManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Runs the application.","lastModifiedDate":"2019-02-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"public class MainApp extends Application {","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final Version VERSION \u003d new Version(0, 2, 2, true);","lastModifiedDate":"2023-08-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(MainApp.class);","lastModifiedDate":"2017-04-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" protected Ui ui;","lastModifiedDate":"2016-09-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" protected Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" protected Storage storage;","lastModifiedDate":"2016-09-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" protected Model model;","lastModifiedDate":"2016-09-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" protected Config config;","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void init() throws Exception {","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" logger.info(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d[ Initializing AddressBook ]\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\");","lastModifiedDate":"2016-09-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" super.init();","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d AppParameters.parse(getParameters());","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" config \u003d initConfig(appParameters.getConfigPath());","lastModifiedDate":"2018-04-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" initLogging(config);","lastModifiedDate":"2023-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" UserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(config.getUserPrefsFilePath());","lastModifiedDate":"2017-02-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d initPrefs(userPrefsStorage);","lastModifiedDate":"2018-12-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" AddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(userPrefs.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2017-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" model \u003d initModelManager(storage, userPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" ui \u003d new UiManager(logic);","lastModifiedDate":"2018-12-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Returns a {@code ModelManager} with the data from {@code storage}\u0027s address book and {@code userPrefs}. \u003cbr\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * The data from the sample address book will be used instead if {@code storage}\u0027s address book is not found,","lastModifiedDate":"2017-08-16"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * or an empty address book will be used instead if errors occur when reading {@code storage}\u0027s address book.","lastModifiedDate":"2017-08-16"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" logger.info(\"Using data file : \" + storage.getAddressBookFilePath());","lastModifiedDate":"2023-07-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e addressBookOptional;","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook initialData;","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" addressBookOptional \u003d storage.readAddressBook();","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" if (!addressBookOptional.isPresent()) {","lastModifiedDate":"2016-09-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" logger.info(\"Creating a new data file \" + storage.getAddressBookFilePath()","lastModifiedDate":"2023-05-15"},{"lineNumber":84,"author":{"gitId":"-"},"content":" + \" populated with a sample AddressBook.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" initialData \u003d addressBookOptional.orElseGet(SampleDataUtil::getSampleAddressBook);","lastModifiedDate":"2016-12-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" logger.warning(\"Data file at \" + storage.getAddressBookFilePath() + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" + \" Will be starting with an empty AddressBook.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" initialData \u003d new AddressBook();","lastModifiedDate":"2016-09-24"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return new ModelManager(initialData, userPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private void initLogging(Config config) {","lastModifiedDate":"2016-09-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":" LogsCenter.init(config);","lastModifiedDate":"2016-09-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * Returns a {@code Config} using the file at {@code configFilePath}. \u003cbr\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * The default file path {@code Config#DEFAULT_CONFIG_FILE} will be used instead","lastModifiedDate":"2017-08-16"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * if {@code configFilePath} is null.","lastModifiedDate":"2017-08-16"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":105,"author":{"gitId":"-"},"content":" protected Config initConfig(Path configFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Config initializedConfig;","lastModifiedDate":"2016-09-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Path configFilePathUsed;","lastModifiedDate":"2018-04-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" configFilePathUsed \u003d Config.DEFAULT_CONFIG_FILE;","lastModifiedDate":"2016-09-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (configFilePath !\u003d null) {","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" logger.info(\"Custom Config file specified \" + configFilePath);","lastModifiedDate":"2016-09-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" configFilePathUsed \u003d configFilePath;","lastModifiedDate":"2016-09-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" logger.info(\"Using config file : \" + configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Optional\u003cConfig\u003e configOptional \u003d ConfigUtil.readConfig(configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" if (!configOptional.isPresent()) {","lastModifiedDate":"2023-01-03"},{"lineNumber":121,"author":{"gitId":"-"},"content":" logger.info(\"Creating new config file \" + configFilePathUsed);","lastModifiedDate":"2023-05-15"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-01-03"},{"lineNumber":123,"author":{"gitId":"-"},"content":" initializedConfig \u003d configOptional.orElse(new Config());","lastModifiedDate":"2016-09-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" logger.warning(\"Config file at \" + configFilePathUsed + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":126,"author":{"gitId":"-"},"content":" + \" Using default config properties.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":127,"author":{"gitId":"-"},"content":" initializedConfig \u003d new Config();","lastModifiedDate":"2016-09-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":130,"author":{"gitId":"-"},"content":" //Update config file in case it was missing to begin with or there are new/unused fields","lastModifiedDate":"2016-09-24"},{"lineNumber":131,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(initializedConfig, configFilePathUsed);","lastModifiedDate":"2016-09-24"},{"lineNumber":133,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":134,"author":{"gitId":"-"},"content":" logger.warning(\"Failed to save config file : \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return initializedConfig;","lastModifiedDate":"2016-09-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":140,"author":{"gitId":"-"},"content":" * Returns a {@code UserPrefs} using the file at {@code storage}\u0027s user prefs file path,","lastModifiedDate":"2017-08-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" * or a new {@code UserPrefs} with default configuration if errors occur when","lastModifiedDate":"2017-08-16"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * reading from the file.","lastModifiedDate":"2017-08-16"},{"lineNumber":143,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":144,"author":{"gitId":"-"},"content":" protected UserPrefs initPrefs(UserPrefsStorage storage) {","lastModifiedDate":"2017-02-25"},{"lineNumber":145,"author":{"gitId":"-"},"content":" Path prefsFilePath \u003d storage.getUserPrefsFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":" logger.info(\"Using preference file : \" + prefsFilePath);","lastModifiedDate":"2023-05-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":148,"author":{"gitId":"-"},"content":" UserPrefs initializedPrefs;","lastModifiedDate":"2016-09-24"},{"lineNumber":149,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":150,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e prefsOptional \u003d storage.readUserPrefs();","lastModifiedDate":"2016-09-25"},{"lineNumber":151,"author":{"gitId":"-"},"content":" if (!prefsOptional.isPresent()) {","lastModifiedDate":"2023-01-03"},{"lineNumber":152,"author":{"gitId":"-"},"content":" logger.info(\"Creating new preference file \" + prefsFilePath);","lastModifiedDate":"2023-05-15"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-01-03"},{"lineNumber":154,"author":{"gitId":"-"},"content":" initializedPrefs \u003d prefsOptional.orElse(new UserPrefs());","lastModifiedDate":"2016-09-24"},{"lineNumber":155,"author":{"gitId":"-"},"content":" } catch (DataLoadingException e) {","lastModifiedDate":"2023-06-14"},{"lineNumber":156,"author":{"gitId":"-"},"content":" logger.warning(\"Preference file at \" + prefsFilePath + \" could not be loaded.\"","lastModifiedDate":"2023-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" + \" Using default preferences.\");","lastModifiedDate":"2023-05-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":" initializedPrefs \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" //Update prefs file in case it was missing to begin with or there are new/unused fields","lastModifiedDate":"2016-09-24"},{"lineNumber":162,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":163,"author":{"gitId":"-"},"content":" storage.saveUserPrefs(initializedPrefs);","lastModifiedDate":"2016-09-25"},{"lineNumber":164,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":165,"author":{"gitId":"-"},"content":" logger.warning(\"Failed to save config file : \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":168,"author":{"gitId":"-"},"content":" return initializedPrefs;","lastModifiedDate":"2016-09-24"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":171,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public void start(Stage primaryStage) {","lastModifiedDate":"2016-08-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":" logger.info(\"Starting AddressBook \" + MainApp.VERSION);","lastModifiedDate":"2016-09-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" ui.start(primaryStage);","lastModifiedDate":"2016-09-25"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":177,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":178,"author":{"gitId":"-"},"content":" public void stop() {","lastModifiedDate":"2016-08-08"},{"lineNumber":179,"author":{"gitId":"-"},"content":" logger.info(\"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d [ Stopping Address Book ] \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\");","lastModifiedDate":"2016-09-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-24"},{"lineNumber":181,"author":{"gitId":"-"},"content":" storage.saveUserPrefs(model.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":182,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-24"},{"lineNumber":183,"author":{"gitId":"-"},"content":" logger.severe(\"Failed to save preferences \" + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-24"},{"lineNumber":184,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":24,"-":162}},{"path":"src/main/java/tutorpro/commons/core/Config.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2016-09-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Config values used by the app","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Config {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final Path DEFAULT_CONFIG_FILE \u003d Paths.get(\"config.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" // Config values customizable through config file","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private Level logLevel \u003d Level.INFO;","lastModifiedDate":"2016-09-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private Path userPrefsFilePath \u003d Paths.get(\"preferences.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public Level getLogLevel() {","lastModifiedDate":"2016-09-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return logLevel;","lastModifiedDate":"2016-09-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void setLogLevel(Level logLevel) {","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.logLevel \u003d logLevel;","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return userPrefsFilePath;","lastModifiedDate":"2016-09-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefsFilePath(Path userPrefsFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.userPrefsFilePath \u003d userPrefsFilePath;","lastModifiedDate":"2016-09-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof Config)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Config otherConfig \u003d (Config) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return Objects.equals(logLevel, otherConfig.logLevel)","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(userPrefsFilePath, otherConfig.userPrefsFilePath);","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Objects.hash(logLevel, userPrefsFilePath);","lastModifiedDate":"2018-12-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .add(\"logLevel\", logLevel)","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .add(\"userPrefsFilePath\", userPrefsFilePath)","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":64}},{"path":"src/main/java/tutorpro/commons/core/GuiSettings.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.awt.Point;","lastModifiedDate":"2017-01-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.Serializable;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * A Serializable class that contains the GUI settings.","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Guarantees: immutable.","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class GuiSettings implements Serializable {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final double DEFAULT_HEIGHT \u003d 600;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final double DEFAULT_WIDTH \u003d 740;","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final double windowWidth;","lastModifiedDate":"2018-11-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private final double windowHeight;","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Point windowCoordinates;","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code GuiSettings} with the default height, width and position.","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public GuiSettings() {","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" windowWidth \u003d DEFAULT_WIDTH;","lastModifiedDate":"2018-08-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" windowHeight \u003d DEFAULT_HEIGHT;","lastModifiedDate":"2018-08-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" windowCoordinates \u003d null; // null represent no coordinates","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Constructs a {@code GuiSettings} with the specified height, width and position.","lastModifiedDate":"2020-05-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public GuiSettings(double windowWidth, double windowHeight, int xPosition, int yPosition) {","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.windowWidth \u003d windowWidth;","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.windowHeight \u003d windowHeight;","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" windowCoordinates \u003d new Point(xPosition, yPosition);","lastModifiedDate":"2018-08-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public double getWindowWidth() {","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" return windowWidth;","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public double getWindowHeight() {","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return windowHeight;","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public Point getWindowCoordinates() {","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return windowCoordinates !\u003d null ? new Point(windowCoordinates) : null;","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (!(other instanceof GuiSettings)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" GuiSettings otherGuiSettings \u003d (GuiSettings) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return windowWidth \u003d\u003d otherGuiSettings.windowWidth","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u0026\u0026 windowHeight \u003d\u003d otherGuiSettings.windowHeight","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(windowCoordinates, otherGuiSettings.windowCoordinates);","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return Objects.hash(windowWidth, windowHeight, windowCoordinates);","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .add(\"windowWidth\", windowWidth)","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .add(\"windowHeight\", windowHeight)","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .add(\"windowCoordinates\", windowCoordinates)","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":80}},{"path":"src/main/java/tutorpro/commons/core/LogsCenter.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2023-05-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-05-20"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.ConsoleHandler;","lastModifiedDate":"2017-01-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.FileHandler;","lastModifiedDate":"2017-01-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.SimpleFormatter;","lastModifiedDate":"2017-01-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Configures and manages loggers and handlers, including their logging level","lastModifiedDate":"2016-09-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Named {@link Logger}s can be obtained from this class\u003cbr\u003e","lastModifiedDate":"2016-09-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * These loggers have been configured to output messages to the console and a {@code .log} file by default,","lastModifiedDate":"2016-09-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * at the {@code INFO} level. A new {@code .log} file with a new numbering will be created after the log","lastModifiedDate":"2016-09-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * file reaches 5MB big, up to a maximum of 5 files.\u003cbr\u003e","lastModifiedDate":"2016-09-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class LogsCenter {","lastModifiedDate":"2016-09-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final int MAX_FILE_COUNT \u003d 5;","lastModifiedDate":"2016-09-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final int MAX_FILE_SIZE_IN_BYTES \u003d (int) (Math.pow(2, 20) * 5); // 5MB","lastModifiedDate":"2016-09-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String LOG_FILE \u003d \"addressbook.log\";","lastModifiedDate":"2016-09-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final Logger logger; // logger for this class","lastModifiedDate":"2023-07-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static Logger baseLogger; // to be used as the parent of all other loggers created by this class.","lastModifiedDate":"2023-07-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static Level currentLogLevel \u003d Level.INFO;","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // This static block ensures essential loggers are created early","lastModifiedDate":"2023-07-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2023-07-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" setBaseLogger();","lastModifiedDate":"2023-07-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" logger \u003d LogsCenter.getLogger(LogsCenter.class);","lastModifiedDate":"2023-07-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Initializes loggers with the log level specified in the {@code config} object. Applies to all loggers created","lastModifiedDate":"2023-07-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * using {@link #getLogger(String)} and {@link #getLogger(Class)} methods except for those that are manually set.","lastModifiedDate":"2023-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static void init(Config config) {","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" currentLogLevel \u003d config.getLogLevel();","lastModifiedDate":"2016-09-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" logger.info(\"Log level will be set as: \" + currentLogLevel);","lastModifiedDate":"2023-07-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // set the level of the baseLogger which will be inherited by other loggers","lastModifiedDate":"2023-07-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" baseLogger.setLevel(currentLogLevel);","lastModifiedDate":"2023-07-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Creates a logger with the given name prefixed by the {@code baseLogger}\u0027s name so that the created logger","lastModifiedDate":"2023-07-19"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * becomes a descendant of the {@code baseLogger}. Furthermore, the returned logger will have the same log handlers","lastModifiedDate":"2023-07-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * as the {@code baseLogger}.","lastModifiedDate":"2023-07-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static Logger getLogger(String name) {","lastModifiedDate":"2016-09-28"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Java organizes loggers into a hierarchy based on their names (using \u0027.\u0027 as a separator, similar to how Java","lastModifiedDate":"2023-07-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // packages form a hierarchy). Furthermore, loggers without a level inherit the level of their parent logger.","lastModifiedDate":"2023-07-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // By prefixing names of all loggers with baseLogger\u0027s name + \".\", we make the baseLogger the parent of all","lastModifiedDate":"2023-07-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // loggers. This allows us to change the level of all loggers simply by changing the baseLogger level.","lastModifiedDate":"2023-07-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Logger logger \u003d Logger.getLogger(baseLogger.getName() + \".\" + name);","lastModifiedDate":"2023-07-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" removeHandlers(logger);","lastModifiedDate":"2016-09-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":" logger.setUseParentHandlers(true);","lastModifiedDate":"2023-07-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return logger;","lastModifiedDate":"2023-07-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Creates a Logger for the given class name.","lastModifiedDate":"2017-01-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Logger getLogger(Class\u003cT\u003e clazz) {","lastModifiedDate":"2017-01-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" requireNonNull(clazz);","lastModifiedDate":"2023-05-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return getLogger(clazz.getSimpleName());","lastModifiedDate":"2017-01-16"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Removes all handlers from the {@code logger}.","lastModifiedDate":"2023-07-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static void removeHandlers(Logger logger) {","lastModifiedDate":"2016-09-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Arrays.stream(logger.getHandlers())","lastModifiedDate":"2018-01-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .forEach(logger::removeHandler);","lastModifiedDate":"2018-01-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Creates a logger named \u0027ab3\u0027, containing a {@code ConsoleHandler} and a {@code FileHandler}.","lastModifiedDate":"2023-07-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Sets it as the {@code baseLogger}, to be used as the parent logger of all other loggers.","lastModifiedDate":"2023-07-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static void setBaseLogger() {","lastModifiedDate":"2023-07-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" baseLogger \u003d Logger.getLogger(\"ab3\");","lastModifiedDate":"2023-07-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" baseLogger.setUseParentHandlers(false);","lastModifiedDate":"2023-07-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" removeHandlers(baseLogger);","lastModifiedDate":"2023-07-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" // Level.ALL is used as the level for the handlers because the baseLogger filters the log messages by level","lastModifiedDate":"2023-07-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // already; there is no need to control log message level of the handlers.","lastModifiedDate":"2023-07-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // add a ConsoleHandler to log to the console","lastModifiedDate":"2023-07-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" ConsoleHandler consoleHandler \u003d new ConsoleHandler();","lastModifiedDate":"2023-07-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" consoleHandler.setLevel(Level.ALL);","lastModifiedDate":"2023-07-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" baseLogger.addHandler(consoleHandler);","lastModifiedDate":"2023-07-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // add a FileHandler to log to a file","lastModifiedDate":"2023-07-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-09"},{"lineNumber":96,"author":{"gitId":"-"},"content":" FileHandler fileHandler \u003d new FileHandler(LOG_FILE, MAX_FILE_SIZE_IN_BYTES, MAX_FILE_COUNT, true);","lastModifiedDate":"2023-07-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" fileHandler.setFormatter(new SimpleFormatter());","lastModifiedDate":"2023-07-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" fileHandler.setLevel(Level.ALL);","lastModifiedDate":"2023-07-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" baseLogger.addHandler(fileHandler);","lastModifiedDate":"2023-07-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-09"},{"lineNumber":101,"author":{"gitId":"-"},"content":" logger.warning(\"Error adding file handler for logger.\");","lastModifiedDate":"2016-09-09"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":105}},{"path":"src/main/java/tutorpro/commons/core/Version.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Represents a version with major, minor and patch number","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Version implements Comparable\u003cVersion\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String VERSION_REGEX \u003d \"V(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)(ea)?\";","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String EXCEPTION_STRING_NOT_VERSION \u003d \"String is not a valid Version. %s\";","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Pattern VERSION_PATTERN \u003d Pattern.compile(VERSION_REGEX);","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final int major;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final int minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final int patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final boolean isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code Version} with the given version details.","lastModifiedDate":"2020-05-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public Version(int major, int minor, int patch, boolean isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.major \u003d major;","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.minor \u003d minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.patch \u003d patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.isEarlyAccess \u003d isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public int getMajor() {","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return major;","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public int getMinor() {","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return minor;","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public int getPatch() {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return patch;","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean isEarlyAccess() {","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return isEarlyAccess;","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Parses a version number string in the format V1.2.3.","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * @param versionString version number string","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * @return a Version object","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static Version fromString(String versionString) throws IllegalArgumentException {","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Matcher versionMatcher \u003d VERSION_PATTERN.matcher(versionString);","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" if (!versionMatcher.find()) {","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(String.format(EXCEPTION_STRING_NOT_VERSION, versionString));","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new Version(Integer.parseInt(versionMatcher.group(1)),","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Integer.parseInt(versionMatcher.group(2)),","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" Integer.parseInt(versionMatcher.group(3)),","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" versionMatcher.group(4) \u003d\u003d null ? false : true);","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @JsonValue","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return String.format(\"V%d.%d.%d%s\", major, minor, patch, isEarlyAccess ? \"ea\" : \"\");","lastModifiedDate":"2016-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public int compareTo(Version other) {","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (major !\u003d other.major) {","lastModifiedDate":"2018-08-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return major - other.major;","lastModifiedDate":"2018-08-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" if (minor !\u003d other.minor) {","lastModifiedDate":"2018-08-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return minor - other.minor;","lastModifiedDate":"2018-08-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":83,"author":{"gitId":"-"},"content":" if (patch !\u003d other.patch) {","lastModifiedDate":"2018-08-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return patch - other.patch;","lastModifiedDate":"2018-08-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (isEarlyAccess \u003d\u003d other.isEarlyAccess()) {","lastModifiedDate":"2018-08-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return 0;","lastModifiedDate":"2017-05-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (isEarlyAccess) {","lastModifiedDate":"2018-08-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return -1;","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return 1;","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (!(other instanceof Version)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Version otherVersion \u003d (Version) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return major \u003d\u003d otherVersion.major","lastModifiedDate":"2023-07-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \u0026\u0026 minor \u003d\u003d otherVersion.minor","lastModifiedDate":"2023-07-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \u0026\u0026 patch \u003d\u003d otherVersion.patch","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" \u0026\u0026 isEarlyAccess \u003d\u003d otherVersion.isEarlyAccess;","lastModifiedDate":"2023-07-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" String hash \u003d String.format(\"%03d%03d%03d\", major, minor, patch);","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" if (!isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" hash \u003d \"1\" + hash;","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return Integer.parseInt(hash);","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":120}},{"path":"src/main/java/tutorpro/commons/core/index/Index.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core.index;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Represents a zero-based or one-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * {@code Index} should be used right from the start (when parsing in a new user input), so that if the current","lastModifiedDate":"2017-05-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * component wants to communicate with another component, it can send an {@code Index} to avoid having to know what","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * base the other component is using for its index. However, after receiving the {@code Index}, that component can","lastModifiedDate":"2017-05-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * convert it back to an int if the index will not be passed to a different component again.","lastModifiedDate":"2017-05-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Index {","lastModifiedDate":"2017-05-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private int zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Index can only be created by calling {@link Index#fromZeroBased(int)} or","lastModifiedDate":"2017-05-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * {@link Index#fromOneBased(int)}.","lastModifiedDate":"2017-05-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Index(int zeroBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" if (zeroBasedIndex \u003c 0) {","lastModifiedDate":"2017-05-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" throw new IndexOutOfBoundsException();","lastModifiedDate":"2017-05-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" this.zeroBasedIndex \u003d zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public int getZeroBased() {","lastModifiedDate":"2017-05-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return zeroBasedIndex;","lastModifiedDate":"2017-05-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public int getOneBased() {","lastModifiedDate":"2017-05-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return zeroBasedIndex + 1;","lastModifiedDate":"2017-05-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Creates a new {@code Index} using a zero-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static Index fromZeroBased(int zeroBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return new Index(zeroBasedIndex);","lastModifiedDate":"2017-05-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Creates a new {@code Index} using a one-based index.","lastModifiedDate":"2017-05-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static Index fromOneBased(int oneBasedIndex) {","lastModifiedDate":"2017-05-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return new Index(oneBasedIndex - 1);","lastModifiedDate":"2017-05-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (!(other instanceof Index)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Index otherIndex \u003d (Index) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return zeroBasedIndex \u003d\u003d otherIndex.zeroBasedIndex;","lastModifiedDate":"2023-07-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"zeroBasedIndex\", zeroBasedIndex).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"Wyrkx":2,"-":67}},{"path":"src/main/java/tutorpro/commons/exceptions/DataLoadingException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-14"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2023-06-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents an error during loading of data from a file.","lastModifiedDate":"2023-06-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-06-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class DataLoadingException extends Exception {","lastModifiedDate":"2023-06-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public DataLoadingException(Exception cause) {","lastModifiedDate":"2023-06-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(cause);","lastModifiedDate":"2023-06-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-14"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2023-06-14"}],"authorContributionMap":{"Wyrkx":1,"-":10}},{"path":"src/main/java/tutorpro/commons/exceptions/IllegalValueException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that some given data does not fulfill some constraints.","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class IllegalValueException extends Exception {","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * @param message should contain relevant information on the failed constraint(s)","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public IllegalValueException(String message) {","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * @param message should contain relevant information on the failed constraint(s)","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * @param cause of the main exception","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public IllegalValueException(String message, Throwable cause) {","lastModifiedDate":"2017-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":1,"-":20}},{"path":"src/main/java/tutorpro/commons/util/AppUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.scene.image.Image;","lastModifiedDate":"2016-08-18"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * A container for App specific utility functions","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AppUtil {","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Gets an {@code Image} from the specified path.","lastModifiedDate":"2020-05-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static Image getImage(String imagePath) {","lastModifiedDate":"2016-08-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":" requireNonNull(imagePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" return new Image(MainApp.class.getResourceAsStream(imagePath));","lastModifiedDate":"2016-08-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Checks that {@code condition} is true. Used for validating arguments to methods.","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException if {@code condition} is false.","lastModifiedDate":"2017-05-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static void checkArgument(Boolean condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (!condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException();","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Checks that {@code condition} is true. Used for validating arguments to methods.","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException with {@code errorMessage} if {@code condition} is false.","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static void checkArgument(Boolean condition, String errorMessage) {","lastModifiedDate":"2017-05-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (!condition) {","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(errorMessage);","lastModifiedDate":"2017-05-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":2,"-":40}},{"path":"src/main/java/tutorpro/commons/util/CollectionUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-06-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-30"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2016-12-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Utility methods related to Collections","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class CollectionUtil {","lastModifiedDate":"2016-09-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /** @see #requireAllNonNull(Collection) */","lastModifiedDate":"2017-05-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static void requireAllNonNull(Object... items) {","lastModifiedDate":"2017-05-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":" requireNonNull(items);","lastModifiedDate":"2017-06-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Stream.of(items).forEach(Objects::requireNonNull);","lastModifiedDate":"2017-05-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Throws NullPointerException if {@code items} or any element of {@code items} is null.","lastModifiedDate":"2017-05-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static void requireAllNonNull(Collection\u003c?\u003e items) {","lastModifiedDate":"2017-05-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(items);","lastModifiedDate":"2017-06-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" items.forEach(Objects::requireNonNull);","lastModifiedDate":"2017-05-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns true if {@code items} contain any elements that are non-null.","lastModifiedDate":"2017-06-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static boolean isAnyNonNull(Object... items) {","lastModifiedDate":"2017-06-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return items !\u003d null \u0026\u0026 Arrays.stream(items).anyMatch(Objects::nonNull);","lastModifiedDate":"2017-06-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":1,"-":34}},{"path":"src/main/java/tutorpro/commons/util/ConfigUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Config;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * A class for accessing the Config File.","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class ConfigUtil {","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static Optional\u003cConfig\u003e readConfig(Path configFilePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":16,"author":{"gitId":"-"},"content":" return JsonUtil.readJsonFile(configFilePath, Config.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static void saveConfig(Config config, Path configFilePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(config, configFilePath);","lastModifiedDate":"2016-10-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":3,"-":20}},{"path":"src/main/java/tutorpro/commons/util/FileUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2016-08-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.InvalidPathException;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Writes and reads files","lastModifiedDate":"2016-10-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class FileUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String CHARSET \u003d \"UTF-8\";","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static boolean isFileExists(Path file) {","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" return Files.exists(file) \u0026\u0026 Files.isRegularFile(file);","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Returns true if {@code path} can be converted into a {@code Path} via {@link Paths#get(String)},","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * otherwise returns false.","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param path A string representing the file path. Cannot be null.","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static boolean isValidPath(String path) {","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Paths.get(path);","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" } catch (InvalidPathException ipe) {","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Creates a file if it does not exist along with its missing parent directories.","lastModifiedDate":"2017-08-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @throws IOException if the file or directory cannot be created.","lastModifiedDate":"2017-08-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static void createIfMissing(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (!isFileExists(file)) {","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" createFile(file);","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Creates a file if it does not exist along with its missing parent directories.","lastModifiedDate":"2018-04-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static void createFile(Path file) throws IOException {","lastModifiedDate":"2018-04-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (Files.exists(file)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2018-04-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" createParentDirsOfFile(file);","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Files.createFile(file);","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Creates parent directories of file if it has a parent directory","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static void createParentDirsOfFile(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Path parentDir \u003d file.getParent();","lastModifiedDate":"2018-04-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (parentDir !\u003d null) {","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Files.createDirectories(parentDir);","lastModifiedDate":"2018-04-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Assumes file exists","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static String readFromFile(Path file) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return new String(Files.readAllBytes(file), CHARSET);","lastModifiedDate":"2018-04-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Writes given string to a file.","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Will create the file if it does not exist yet.","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static void writeToFile(Path file, String content) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Files.write(file, content.getBytes(CHARSET));","lastModifiedDate":"2018-04-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":82}},{"path":"src/main/java/tutorpro/commons/util/JsonUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonAutoDetect;","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.PropertyAccessor;","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.core.JsonProcessingException;","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationContext;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationFeature;","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ObjectMapper;","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.SerializationFeature;","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.module.SimpleModule;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Converts a Java object instance to JSON and vice versa","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class JsonUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonUtil.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static ObjectMapper objectMapper \u003d new ObjectMapper().findAndRegisterModules()","lastModifiedDate":"2016-10-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)","lastModifiedDate":"2016-10-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)","lastModifiedDate":"2016-10-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":" .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)","lastModifiedDate":"2016-10-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)","lastModifiedDate":"2016-10-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .registerModule(new SimpleModule(\"SimpleModule\")","lastModifiedDate":"2016-10-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .addSerializer(Level.class, new ToStringSerializer())","lastModifiedDate":"2016-10-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .addDeserializer(Level.class, new LevelDeserializer(Level.class)));","lastModifiedDate":"2016-10-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" static \u003cT\u003e void serializeObjectToJsonFile(Path jsonFile, T objectToSerialize) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(jsonFile, toJsonString(objectToSerialize));","lastModifiedDate":"2016-10-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" static \u003cT\u003e T deserializeObjectFromJsonFile(Path jsonFile, Class\u003cT\u003e classOfObjectToDeserialize)","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return fromJsonString(FileUtil.readFromFile(jsonFile), classOfObjectToDeserialize);","lastModifiedDate":"2016-10-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns the JSON object from the given file or {@code Optional.empty()} object if the file is not found.","lastModifiedDate":"2023-06-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * If any values are missing from the file, default values will be used, as long as the file is a valid JSON file.","lastModifiedDate":"2023-06-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * @param filePath cannot be null.","lastModifiedDate":"2016-10-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @param classOfObjectToDeserialize JSON file has to correspond to the structure in the class given here.","lastModifiedDate":"2023-06-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading of the JSON file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Optional\u003cT\u003e readJsonFile(","lastModifiedDate":"2016-10-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Path filePath, Class\u003cT\u003e classOfObjectToDeserialize) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!Files.exists(filePath)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2016-10-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.info(\"JSON file \" + filePath + \" found.\");","lastModifiedDate":"2023-01-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" T jsonFile;","lastModifiedDate":"2016-10-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-10-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":" jsonFile \u003d deserializeObjectFromJsonFile(filePath, classOfObjectToDeserialize);","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-10-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" logger.warning(\"Error reading from jsonFile file \" + filePath + \": \" + e);","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new DataLoadingException(e);","lastModifiedDate":"2023-06-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Optional.of(jsonFile);","lastModifiedDate":"2016-10-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Saves the Json object to the specified file.","lastModifiedDate":"2016-10-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * Overwrites existing file if it exists, creates a new file if it doesn\u0027t.","lastModifiedDate":"2016-10-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param jsonFile cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param filePath cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @throws IOException if there was an error during writing to the file","lastModifiedDate":"2016-10-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public static \u003cT\u003e void saveJsonFile(T jsonFile, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" requireNonNull(jsonFile);","lastModifiedDate":"2017-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" serializeObjectToJsonFile(filePath, jsonFile);","lastModifiedDate":"2018-04-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Converts a given string representation of a JSON data to instance of a class","lastModifiedDate":"2016-10-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * @return The instance of T with the specified values in the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public static \u003cT\u003e T fromJsonString(String json, Class\u003cT\u003e instanceClass) throws IOException {","lastModifiedDate":"2016-10-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return objectMapper.readValue(json, instanceClass);","lastModifiedDate":"2016-10-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Converts a given instance of a class into its JSON data string representation","lastModifiedDate":"2016-10-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @param instance The T object to be converted into the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @return JSON data representation of the given class instance, in string","lastModifiedDate":"2016-10-19"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static \u003cT\u003e String toJsonString(T instance) throws JsonProcessingException {","lastModifiedDate":"2016-10-19"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(instance);","lastModifiedDate":"2016-10-19"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Contains methods that retrieve logging level from serialized string.","lastModifiedDate":"2017-08-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private static class LevelDeserializer extends FromStringDeserializer\u003cLevel\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" protected LevelDeserializer(Class\u003c?\u003e vc) {","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" super(vc);","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" protected Level _deserialize(String value, DeserializationContext ctxt) {","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return getLoggingLevel(value);","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Gets the logging level that matches loggingLevelString","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * \u003cp\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Returns null if there are no matches","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private Level getLoggingLevel(String loggingLevelString) {","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return Level.parse(loggingLevelString);","lastModifiedDate":"2016-09-09"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public Class\u003cLevel\u003e handledType() {","lastModifiedDate":"2016-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return Level.class;","lastModifiedDate":"2016-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":3,"-":141}},{"path":"src/main/java/tutorpro/commons/util/StringUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.PrintWriter;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.StringWriter;","lastModifiedDate":"2016-09-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Helper functions for handling strings.","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class StringUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Returns true if the {@code sentence} contains the {@code word}.","lastModifiedDate":"2016-10-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Ignores case, but a full word match is required.","lastModifiedDate":"2016-10-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * \u003cbr\u003eexamples:\u003cpre\u003e","lastModifiedDate":"2016-10-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"abc\") \u003d\u003d true","lastModifiedDate":"2016-10-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"DEF\") \u003d\u003d true","lastModifiedDate":"2016-10-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * containsWordIgnoreCase(\"ABc def\", \"AB\") \u003d\u003d false //not a full word match","lastModifiedDate":"2016-10-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * \u003c/pre\u003e","lastModifiedDate":"2016-10-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param sentence cannot be null","lastModifiedDate":"2016-10-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @param word cannot be null, cannot be empty, must be a single word","lastModifiedDate":"2016-10-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static boolean containsWordIgnoreCase(String sentence, String word) {","lastModifiedDate":"2016-10-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" requireNonNull(sentence);","lastModifiedDate":"2017-05-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(word);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" String preppedWord \u003d word.trim();","lastModifiedDate":"2016-10-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" checkArgument(!preppedWord.isEmpty(), \"Word parameter cannot be empty\");","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" checkArgument(preppedWord.split(\"\\\\s+\").length \u003d\u003d 1, \"Word parameter should be a single word\");","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String preppedSentence \u003d sentence;","lastModifiedDate":"2016-10-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" String[] wordsInPreppedSentence \u003d preppedSentence.split(\"\\\\s+\");","lastModifiedDate":"2016-10-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return Arrays.stream(wordsInPreppedSentence)","lastModifiedDate":"2018-01-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .anyMatch(preppedWord::equalsIgnoreCase);","lastModifiedDate":"2018-01-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Returns a detailed message of the t, including the stack trace.","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static String getDetails(Throwable t) {","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(t);","lastModifiedDate":"2017-05-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" StringWriter sw \u003d new StringWriter();","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" t.printStackTrace(new PrintWriter(sw));","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return t.getMessage() + \"\\n\" + sw.toString();","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns true if {@code s} represents a non-zero unsigned integer","lastModifiedDate":"2017-06-02"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * e.g. 1, 2, 3, ..., {@code Integer.MAX_VALUE} \u003cbr\u003e","lastModifiedDate":"2017-06-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Will return false for any other non-null string input","lastModifiedDate":"2017-06-02"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * e.g. empty string, \"-1\", \"0\", \"+1\", and \" 2 \" (untrimmed), \"3 0\" (contains whitespace), \"1 a\" (contains letters)","lastModifiedDate":"2017-06-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code s} is null.","lastModifiedDate":"2017-06-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static boolean isNonZeroUnsignedInteger(String s) {","lastModifiedDate":"2017-06-02"},{"lineNumber":59,"author":{"gitId":"-"},"content":" requireNonNull(s);","lastModifiedDate":"2017-06-02"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-06-02"},{"lineNumber":62,"author":{"gitId":"-"},"content":" int value \u003d Integer.parseInt(s);","lastModifiedDate":"2017-06-02"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return value \u003e 0 \u0026\u0026 !s.startsWith(\"+\"); // \"+1\" is successfully parsed by Integer#parseInt(String)","lastModifiedDate":"2017-06-02"},{"lineNumber":64,"author":{"gitId":"-"},"content":" } catch (NumberFormatException nfe) {","lastModifiedDate":"2017-06-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-06-02"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-02"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":66}},{"path":"src/main/java/tutorpro/commons/util/ToStringBuilder.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Builds a string representation of an object that is suitable as the return value of {@link Object#toString()}.","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class ToStringBuilder {","lastModifiedDate":"2019-02-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" private static final String OBJECT_PREFIX \u003d \"{\";","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" private static final String OBJECT_SUFFIX \u003d \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" private static final String FIELD_SEPARATOR \u003d \", \";","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" private static final String FIELD_NAME_VALUE_SEPARATOR \u003d \"\u003d\";","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private final StringBuilder stringBuilder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private boolean hasField;","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Constructs a {@code ToStringBuilder} whose formatted output will be prefixed with {@code objectName}.","lastModifiedDate":"2019-02-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public ToStringBuilder(String objectName) {","lastModifiedDate":"2019-02-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" stringBuilder.append(objectName).append(OBJECT_PREFIX);","lastModifiedDate":"2019-02-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code ToStringBuilder} whose formatted output will be prefixed with the","lastModifiedDate":"2019-02-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * canonical class name of {@code object}.","lastModifiedDate":"2019-02-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public ToStringBuilder(Object object) {","lastModifiedDate":"2019-02-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this(object.getClass().getCanonicalName());","lastModifiedDate":"2019-02-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Adds a field name/value pair to the output string.","lastModifiedDate":"2019-02-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-02-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @param fieldName The name of the field.","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @param fieldValue The value of the field.","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @return A reference to this {@code ToStringBuilder} object, allowing method calls to be chained.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public ToStringBuilder add(String fieldName, Object fieldValue) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" if (hasField) {","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" stringBuilder.append(FIELD_SEPARATOR);","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" stringBuilder.append(fieldName).append(FIELD_NAME_VALUE_SEPARATOR).append(fieldValue);","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" hasField \u003d true;","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns the built formatted string representation.","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return stringBuilder.toString() + OBJECT_SUFFIX;","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-23"}],"authorContributionMap":{"Wyrkx":1,"-":52}},{"path":"src/main/java/tutorpro/logic/Logic.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-09-25"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * API of the Logic component","lastModifiedDate":"2016-09-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2016-09-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2016-09-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2016-09-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2017-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Returns the AddressBook.","lastModifiedDate":"2018-12-03"},{"lineNumber":29,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-03"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" * @see Model#getAddressBook()","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook getAddressBook();","lastModifiedDate":"2018-12-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /** Returns an unmodifiable view of the filtered list of persons */","lastModifiedDate":"2017-09-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getFilteredPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Set the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" void setGuiSettings(GuiSettings guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":8,"-":42}},{"path":"src/main/java/tutorpro/logic/LogicManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-09-24"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.AddressBookParser;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.Storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * The main LogicManager of the app.","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class LogicManager implements Logic {","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String FILE_OPS_ERROR_FORMAT \u003d \"Could not save data due to the following error: %s\";","lastModifiedDate":"2023-06-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String FILE_OPS_PERMISSION_ERROR_FORMAT \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \"Could not save data to file %s due to insufficient permissions to write to the file or the folder.\";","lastModifiedDate":"2023-06-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(LogicManager.class);","lastModifiedDate":"2016-09-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private final Model model;","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private final Storage storage;","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private final AddressBookParser addressBookParser;","lastModifiedDate":"2017-07-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Constructs a {@code LogicManager} with the given {@code Model} and {@code Storage}.","lastModifiedDate":"2020-05-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public LogicManager(Model model, Storage storage) {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.model \u003d model;","lastModifiedDate":"2016-09-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.storage \u003d storage;","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" addressBookParser \u003d new AddressBookParser();","lastModifiedDate":"2018-01-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText) throws CommandException, ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2016-09-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2017-07-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2019-01-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" } catch (AccessDeniedException e) {","lastModifiedDate":"2023-06-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" throw new CommandException(String.format(FILE_OPS_PERMISSION_ERROR_FORMAT, e.getMessage()), e);","lastModifiedDate":"2023-06-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2018-12-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" throw new CommandException(String.format(FILE_OPS_ERROR_FORMAT, ioe.getMessage()), ioe);","lastModifiedDate":"2023-06-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2018-12-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return model.getAddressBook();","lastModifiedDate":"2018-12-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-03"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return model.getFilteredPersonList();","lastModifiedDate":"2016-09-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return model.getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return model.getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" model.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"Wyrkx":12,"-":76}},{"path":"src/main/java/tutorpro/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.Prefix;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":48}},{"path":"src/main/java/tutorpro/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":11,"-":73}},{"path":"src/main/java/tutorpro/logic/commands/ClearCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Clears the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class ClearCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"clear\";","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Address book has been cleared!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":" model.setAddressBook(new AddressBook());","lastModifiedDate":"2018-11-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":20}},{"path":"src/main/java/tutorpro/logic/commands/Command.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a command with hidden internal logic and the ability to be executed.","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public abstract class Command {","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Executes the command and returns the result message.","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * @param model {@code Model} which the command should operate on.","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * @return feedback message of the operation result for display","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public abstract CommandResult execute(Model model) throws CommandException;","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":17}},{"path":"src/main/java/tutorpro/logic/commands/CommandResult.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2018-12-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Represents the result of a command execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class CommandResult {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final String feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /** Help information should be shown to the user. */","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private final boolean showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /** The application should exit. */","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final boolean exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified fields.","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser, boolean showHelp, boolean exit) {","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.feedbackToUser \u003d requireNonNull(feedbackToUser);","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.showHelp \u003d showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.exit \u003d exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified {@code feedbackToUser},","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * and other fields set to their default value.","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser) {","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this(feedbackToUser, false, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public String getFeedbackToUser() {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public boolean isShowHelp() {","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean isExit() {","lastModifiedDate":"2018-12-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2018-12-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" if (!(other instanceof CommandResult)) {","lastModifiedDate":"2018-12-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-12-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" CommandResult otherCommandResult \u003d (CommandResult) other;","lastModifiedDate":"2018-12-09"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return feedbackToUser.equals(otherCommandResult.feedbackToUser)","lastModifiedDate":"2018-12-09"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u0026\u0026 showHelp \u003d\u003d otherCommandResult.showHelp","lastModifiedDate":"2018-12-09"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u0026\u0026 exit \u003d\u003d otherCommandResult.exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2018-12-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return Objects.hash(feedbackToUser, showHelp, exit);","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .add(\"feedbackToUser\", feedbackToUser)","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .add(\"showHelp\", showHelp)","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .add(\"exit\", exit)","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":2,"-":80}},{"path":"src/main/java/tutorpro/logic/commands/DeleteCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-09-01"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Deletes a person identified using it\u0027s displayed index from the address book.","lastModifiedDate":"2018-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class DeleteCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"delete\";","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \": Deletes the person identified by the index number used in the displayed person list.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer)\\n\"","lastModifiedDate":"2016-09-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1\";","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_PERSON_SUCCESS \u003d \"Deleted Person: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Index targetIndex;","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public DeleteCommand(Index targetIndex) {","lastModifiedDate":"2017-05-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.targetIndex \u003d targetIndex;","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (targetIndex.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personToDelete \u003d lastShownList.get(targetIndex.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" model.deletePerson(personToDelete);","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(personToDelete)));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (!(other instanceof DeleteCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" DeleteCommand otherDeleteCommand \u003d (DeleteCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return targetIndex.equals(otherDeleteCommand.targetIndex);","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .add(\"targetIndex\", targetIndex)","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":7,"-":62}},{"path":"src/main/java/tutorpro/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":63,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":86,"author":{"gitId":"Wyrkx"},"content":" model.updateFilteredPersonList(Model.PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2017-03-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":135,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":136,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":137,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":138,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":141,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":146,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":148,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":149,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":155,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);","lastModifiedDate":"2018-08-14"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":163,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":170,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":178,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":179,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":182,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":183,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":184,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":187,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":188,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":194,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":195,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":196,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":197,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":198,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":199,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":202,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":203,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":204,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":205,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":206,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":207,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":208,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":211,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":212,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":213,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":214,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":215,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":217,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":219,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":220,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":222,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":223,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":224,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":225,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":226,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":227,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":228,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":241,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"Wyrkx":19,"-":222}},{"path":"src/main/java/tutorpro/logic/commands/ExitCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Terminates the program.","lastModifiedDate":"2016-09-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class ExitCommand extends Command {","lastModifiedDate":"2016-09-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"exit\";","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EXIT_ACKNOWLEDGEMENT \u003d \"Exiting Address Book as requested ...\";","lastModifiedDate":"2016-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true);","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"Wyrkx":2,"-":17}},{"path":"src/main/java/tutorpro/logic/commands/FindCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Finds and lists all persons in address book whose name contains any of the argument keywords.","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Keyword matching is case insensitive.","lastModifiedDate":"2018-04-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommand extends Command {","lastModifiedDate":"2016-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"find\";","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Finds all persons whose names contain any of \"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"the specified keywords (case-insensitive) and displays them as a list with index numbers.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"Parameters: KEYWORD [MORE_KEYWORDS]...\\n\"","lastModifiedDate":"2016-09-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" alice bob charlie\";","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final NameContainsKeywordsPredicate predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public FindCommand(NameContainsKeywordsPredicate predicate) {","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.predicate \u003d predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new CommandResult(","lastModifiedDate":"2018-04-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size()));","lastModifiedDate":"2018-04-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof FindCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" FindCommand otherFindCommand \u003d (FindCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return predicate.equals(otherFindCommand.predicate);","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .add(\"predicate\", predicate)","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"Wyrkx":5,"-":53}},{"path":"src/main/java/tutorpro/logic/commands/HelpCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-31"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Format full help instructions for every command for display.","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class HelpCommand extends Command {","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"help\";","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Shows program usage instructions.\\n\"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD;","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String SHOWING_HELP_MESSAGE \u003d \"Opened help window.\";","lastModifiedDate":"2016-08-31"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" return new CommandResult(SHOWING_HELP_MESSAGE, true, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":2,"-":19}},{"path":"src/main/java/tutorpro/logic/commands/ListCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Lists all persons in the address book to the user.","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class ListCommand extends Command {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"list\";","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Listed all persons\";","lastModifiedDate":"2016-09-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" model.updateFilteredPersonList(Model.PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":3,"-":20}},{"path":"src/main/java/tutorpro/logic/commands/exceptions/CommandException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Represents an error which occurs during execution of a {@link Command}.","lastModifiedDate":"2017-02-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CommandException extends Exception {","lastModifiedDate":"2017-02-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public CommandException(String message) {","lastModifiedDate":"2017-02-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Constructs a new {@code CommandException} with the specified detail {@code message} and {@code cause}.","lastModifiedDate":"2018-08-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public CommandException(String message, Throwable cause) {","lastModifiedDate":"2018-08-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2018-08-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"Wyrkx":1,"-":16}},{"path":"src/main/java/tutorpro/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":36,"author":{"gitId":"-"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2017-12-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Person person \u003d new Person(name, phone, email, address, tagList);","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"Wyrkx":15,"-":46}},{"path":"src/main/java/tutorpro/logic/parser/AddressBookParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ClearCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ExitCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.HelpCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ListCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses user input.","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookParser {","lastModifiedDate":"2017-07-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Used for initial separation of command word and args.","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Pattern BASIC_COMMAND_FORMAT \u003d Pattern.compile(\"(?\u003ccommandWord\u003e\\\\S+)(?\u003carguments\u003e.*)\");","lastModifiedDate":"2016-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AddressBookParser.class);","lastModifiedDate":"2023-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Parses user input into command for execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param userInput full user input string","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @return the command based on the user input","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" final Matcher matcher \u003d BASIC_COMMAND_FORMAT.matcher(userInput.trim());","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!matcher.matches()) {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Note to developers: Change the log level in config.json to enable lower level (i.e., FINE, FINER and lower)","lastModifiedDate":"2023-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // log messages such as the one below.","lastModifiedDate":"2023-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Lower level log messages are used sparingly to minimize noise in the code.","lastModifiedDate":"2023-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logger.fine(\"Command word: \" + commandWord + \"; Arguments: \" + arguments);","lastModifiedDate":"2023-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" switch (commandWord) {","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" case AddCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return new AddCommandParser().parse(arguments);","lastModifiedDate":"2017-02-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2016-12-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":" case DeleteCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return new DeleteCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" case ClearCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new ClearCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" case FindCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return new FindCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" case ListCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return new ListCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" case ExitCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ExitCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" case HelpCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new HelpCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" default:","lastModifiedDate":"2016-08-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" logger.finer(\"This user input caused a ParseException: \" + userInput);","lastModifiedDate":"2023-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"Wyrkx":14,"-":72}},{"path":"src/main/java/tutorpro/logic/parser/ArgumentMultimap.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2017-03-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-03-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2017-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Stores mapping of prefixes to their respective arguments.","lastModifiedDate":"2017-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Each key may be associated with multiple argument values.","lastModifiedDate":"2017-03-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Values for a given key are stored in a list, and the insertion ordering is maintained.","lastModifiedDate":"2017-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Keys are unique, but the list of argument values may contain duplicate argument values, i.e. the same argument value","lastModifiedDate":"2017-03-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * can be inserted multiple times for the same prefix.","lastModifiedDate":"2017-03-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ArgumentMultimap {","lastModifiedDate":"2017-03-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /** Prefixes mapped to their respective arguments**/","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final Map\u003cPrefix, List\u003cString\u003e\u003e argMultimap \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2017-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Associates the specified argument value with {@code prefix} key in this map.","lastModifiedDate":"2017-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * If the map previously contained a mapping for the key, the new value is appended to the list of existing values.","lastModifiedDate":"2017-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @param prefix Prefix key with which the specified argument value is to be associated","lastModifiedDate":"2017-03-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @param argValue Argument value to be associated with the specified prefix key","lastModifiedDate":"2017-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void put(Prefix prefix, String argValue) {","lastModifiedDate":"2017-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" List\u003cString\u003e argValues \u003d getAllValues(prefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" argValues.add(argValue);","lastModifiedDate":"2017-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" argMultimap.put(prefix, argValues);","lastModifiedDate":"2017-03-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2017-03-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() : Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2017-03-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns all values of {@code prefix}.","lastModifiedDate":"2017-03-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * If the prefix does not exist or has no values, this will return an empty list.","lastModifiedDate":"2017-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Modifying the returned list will not affect the underlying data structure of the ArgumentMultimap.","lastModifiedDate":"2017-03-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getAllValues(Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (!argMultimap.containsKey(prefix)) {","lastModifiedDate":"2017-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e();","lastModifiedDate":"2017-03-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(argMultimap.get(prefix));","lastModifiedDate":"2017-03-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Returns the preamble (text before the first valid prefix). Trims any leading/trailing spaces.","lastModifiedDate":"2017-03-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public String getPreamble() {","lastModifiedDate":"2017-03-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return getValue(new Prefix(\"\")).orElse(\"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Throws a {@code ParseException} if any of the prefixes given in {@code prefixes} appeared more than","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * once among the arguments.","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void verifyNoDuplicatePrefixesFor(Prefix... prefixes) throws ParseException {","lastModifiedDate":"2023-07-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Prefix[] duplicatedPrefixes \u003d Stream.of(prefixes).distinct()","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .filter(prefix -\u003e argMultimap.containsKey(prefix) \u0026\u0026 argMultimap.get(prefix).size() \u003e 1)","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" .toArray(Prefix[]::new);","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (duplicatedPrefixes.length \u003e 0) {","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" throw new ParseException(Messages.getErrorMessageForDuplicatePrefixes(duplicatedPrefixes));","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-08"}],"authorContributionMap":{"Wyrkx":3,"-":75}},{"path":"src/main/java/tutorpro/logic/parser/ArgumentTokenizer.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-01-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-10-16"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Tokenizes arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * e.g. {@code some preamble text t/ 11.00 t/12.00 k/ m/ July} where prefixes are {@code t/ k/ m/}.\u003cbr\u003e","lastModifiedDate":"2017-05-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * 1. An argument\u0027s value can be an empty string e.g. the value of {@code k/} in the above example.\u003cbr\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * 2. Leading and trailing whitespaces of an argument value will be discarded.\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * 3. An argument may be repeated and all its values will be accumulated e.g. the value of {@code t/}","lastModifiedDate":"2017-05-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * in the above example.\u003cbr\u003e","lastModifiedDate":"2016-10-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class ArgumentTokenizer {","lastModifiedDate":"2016-10-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap} object that maps prefixes to their","lastModifiedDate":"2017-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * respective argument values. Only the given prefixes will be recognized in the arguments string.","lastModifiedDate":"2017-03-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2017-03-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) {","lastModifiedDate":"2017-03-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" List\u003cPrefixPosition\u003e positions \u003d findAllPrefixPositions(argsString, prefixes);","lastModifiedDate":"2017-03-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return extractArguments(argsString, positions);","lastModifiedDate":"2017-03-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Finds all zero-based prefix positions in the given arguments string.","lastModifiedDate":"2017-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to find in the arguments string","lastModifiedDate":"2017-03-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @return List of zero-based prefix positions in the given arguments string","lastModifiedDate":"2017-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static List\u003cPrefixPosition\u003e findAllPrefixPositions(String argsString, Prefix... prefixes) {","lastModifiedDate":"2017-03-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return Arrays.stream(prefixes)","lastModifiedDate":"2018-01-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .flatMap(prefix -\u003e findPrefixPositions(argsString, prefix).stream())","lastModifiedDate":"2018-01-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-01-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * {@see findAllPrefixPositions}","lastModifiedDate":"2017-03-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private static List\u003cPrefixPosition\u003e findPrefixPositions(String argsString, Prefix prefix) {","lastModifiedDate":"2017-03-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" List\u003cPrefixPosition\u003e positions \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2016-10-16"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" int prefixPosition \u003d findPrefixPosition(argsString, prefix.getPrefix(), 0);","lastModifiedDate":"2017-05-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" while (prefixPosition !\u003d -1) {","lastModifiedDate":"2017-05-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" PrefixPosition extendedPrefix \u003d new PrefixPosition(prefix, prefixPosition);","lastModifiedDate":"2017-05-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" positions.add(extendedPrefix);","lastModifiedDate":"2016-10-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" prefixPosition \u003d findPrefixPosition(argsString, prefix.getPrefix(), prefixPosition);","lastModifiedDate":"2017-05-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return positions;","lastModifiedDate":"2016-10-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Returns the index of the first occurrence of {@code prefix} in","lastModifiedDate":"2017-05-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * {@code argsString} starting from index {@code fromIndex}. An occurrence","lastModifiedDate":"2017-05-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * is valid if there is a whitespace before {@code prefix}. Returns -1 if no","lastModifiedDate":"2017-05-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * such occurrence can be found.","lastModifiedDate":"2017-05-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * E.g if {@code argsString} \u003d \"e/hip/900\", {@code prefix} \u003d \"p/\" and","lastModifiedDate":"2017-05-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * {@code fromIndex} \u003d 0, this method returns -1 as there are no valid","lastModifiedDate":"2017-05-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * occurrences of \"p/\" with whitespace before it. However, if","lastModifiedDate":"2017-05-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * {@code argsString} \u003d \"e/hi p/900\", {@code prefix} \u003d \"p/\" and","lastModifiedDate":"2017-05-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * {@code fromIndex} \u003d 0, this method returns 5.","lastModifiedDate":"2017-05-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static int findPrefixPosition(String argsString, String prefix, int fromIndex) {","lastModifiedDate":"2017-05-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" int prefixIndex \u003d argsString.indexOf(\" \" + prefix, fromIndex);","lastModifiedDate":"2017-05-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return prefixIndex \u003d\u003d -1 ? -1","lastModifiedDate":"2017-05-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" : prefixIndex + 1; // +1 as offset for whitespace","lastModifiedDate":"2017-05-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Extracts prefixes and their argument values, and returns an {@code ArgumentMultimap} object that maps the","lastModifiedDate":"2017-03-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * extracted prefixes to their respective arguments. Prefixes are extracted based on their zero-based positions in","lastModifiedDate":"2017-03-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * {@code argsString}.","lastModifiedDate":"2017-03-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form: {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2017-03-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param prefixPositions Zero-based positions of all prefixes in {@code argsString}","lastModifiedDate":"2017-03-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static ArgumentMultimap extractArguments(String argsString, List\u003cPrefixPosition\u003e prefixPositions) {","lastModifiedDate":"2017-03-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // Sort by start position","lastModifiedDate":"2016-10-16"},{"lineNumber":90,"author":{"gitId":"-"},"content":" prefixPositions.sort((prefix1, prefix2) -\u003e prefix1.getStartPosition() - prefix2.getStartPosition());","lastModifiedDate":"2016-10-16"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // Insert a PrefixPosition to represent the preamble","lastModifiedDate":"2016-10-16"},{"lineNumber":93,"author":{"gitId":"-"},"content":" PrefixPosition preambleMarker \u003d new PrefixPosition(new Prefix(\"\"), 0);","lastModifiedDate":"2016-10-16"},{"lineNumber":94,"author":{"gitId":"-"},"content":" prefixPositions.add(0, preambleMarker);","lastModifiedDate":"2016-10-16"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // Add a dummy PrefixPosition to represent the end of the string","lastModifiedDate":"2016-10-16"},{"lineNumber":97,"author":{"gitId":"-"},"content":" PrefixPosition endPositionMarker \u003d new PrefixPosition(new Prefix(\"\"), argsString.length());","lastModifiedDate":"2016-10-16"},{"lineNumber":98,"author":{"gitId":"-"},"content":" prefixPositions.add(endPositionMarker);","lastModifiedDate":"2016-10-16"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // Map prefixes to their argument values (if any)","lastModifiedDate":"2017-03-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d new ArgumentMultimap();","lastModifiedDate":"2017-03-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c prefixPositions.size() - 1; i++) {","lastModifiedDate":"2016-10-16"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // Extract and store prefixes and their arguments","lastModifiedDate":"2017-03-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Prefix argPrefix \u003d prefixPositions.get(i).getPrefix();","lastModifiedDate":"2017-03-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String argValue \u003d extractArgumentValue(argsString, prefixPositions.get(i), prefixPositions.get(i + 1));","lastModifiedDate":"2016-10-16"},{"lineNumber":106,"author":{"gitId":"-"},"content":" argMultimap.put(argPrefix, argValue);","lastModifiedDate":"2017-03-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return argMultimap;","lastModifiedDate":"2017-03-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Returns the trimmed value of the argument in the arguments string specified by {@code currentPrefixPosition}.","lastModifiedDate":"2017-03-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * The end position of the value is determined by {@code nextPrefixPosition}.","lastModifiedDate":"2017-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" private static String extractArgumentValue(String argsString,","lastModifiedDate":"2017-03-20"},{"lineNumber":117,"author":{"gitId":"-"},"content":" PrefixPosition currentPrefixPosition,","lastModifiedDate":"2016-10-16"},{"lineNumber":118,"author":{"gitId":"-"},"content":" PrefixPosition nextPrefixPosition) {","lastModifiedDate":"2016-10-16"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Prefix prefix \u003d currentPrefixPosition.getPrefix();","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" int valueStartPos \u003d currentPrefixPosition.getStartPosition() + prefix.getPrefix().length();","lastModifiedDate":"2016-10-16"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String value \u003d argsString.substring(valueStartPos, nextPrefixPosition.getStartPosition());","lastModifiedDate":"2016-10-16"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return value.trim();","lastModifiedDate":"2016-10-16"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":127,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":128,"author":{"gitId":"-"},"content":" * Represents a prefix\u0027s position in an arguments string.","lastModifiedDate":"2017-03-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":130,"author":{"gitId":"-"},"content":" private static class PrefixPosition {","lastModifiedDate":"2017-03-20"},{"lineNumber":131,"author":{"gitId":"-"},"content":" private int startPosition;","lastModifiedDate":"2016-10-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" private final Prefix prefix;","lastModifiedDate":"2016-10-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":134,"author":{"gitId":"-"},"content":" PrefixPosition(Prefix prefix, int startPosition) {","lastModifiedDate":"2016-10-19"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.prefix \u003d prefix;","lastModifiedDate":"2016-10-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" this.startPosition \u003d startPosition;","lastModifiedDate":"2016-10-19"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" int getStartPosition() {","lastModifiedDate":"2016-10-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return startPosition;","lastModifiedDate":"2018-08-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" Prefix getPrefix() {","lastModifiedDate":"2016-10-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return prefix;","lastModifiedDate":"2018-08-14"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-16"}],"authorContributionMap":{"Wyrkx":1,"-":147}},{"path":"src/main/java/tutorpro/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"Wyrkx":1,"-":14}},{"path":"src/main/java/tutorpro/logic/parser/DeleteCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new DeleteCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class DeleteCommandParser implements Parser\u003cDeleteCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the DeleteCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * and returns a DeleteCommand object for execution.","lastModifiedDate":"2019-05-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public DeleteCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2017-05-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new DeleteCommand(index);","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"Wyrkx":5,"-":24}},{"path":"src/main/java/tutorpro/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor editPersonDescriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2017-06-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"Wyrkx":12,"-":72}},{"path":"src/main/java/tutorpro/logic/parser/FindCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new FindCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParser implements Parser\u003cFindCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the FindCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * and returns a FindCommand object for execution.","lastModifiedDate":"2019-05-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public FindCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" String trimmedArgs \u003d args.trim();","lastModifiedDate":"2017-02-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" if (trimmedArgs.isEmpty()) {","lastModifiedDate":"2017-02-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-01-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" String[] nameKeywords \u003d trimmedArgs.split(\"\\\\s+\");","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(nameKeywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"Wyrkx":5,"-":28}},{"path":"src/main/java/tutorpro/logic/parser/Parser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Represents a Parser that is able to parse user input into a {@code Command} of type {@code T}.","lastModifiedDate":"2017-07-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public interface Parser\u003cT extends Command\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a command and returns it.","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * @throws ParseException if {@code userInput} does not conform the expected format","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" T parse(String userInput) throws ParseException;","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"Wyrkx":3,"-":13}},{"path":"src/main/java/tutorpro/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":33,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":48,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":61,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":76,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":86,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":91,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":106,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":108,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":117,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":118,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":120,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"Wyrkx":9,"-":115}},{"path":"src/main/java/tutorpro/logic/parser/Prefix.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * A prefix that marks the beginning of an argument in an arguments string.","lastModifiedDate":"2017-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" * E.g. \u0027t/\u0027 in \u0027add James t/ friend\u0027.","lastModifiedDate":"2017-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class Prefix {","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" private final String prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public Prefix(String prefix) {","lastModifiedDate":"2017-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" this.prefix \u003d prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public String getPrefix() {","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" return prefix;","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return getPrefix();","lastModifiedDate":"2017-05-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return prefix \u003d\u003d null ? 0 : prefix.hashCode();","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" if (!(other instanceof Prefix)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Prefix otherPrefix \u003d (Prefix) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return prefix.equals(otherPrefix.prefix);","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-11"}],"authorContributionMap":{"Wyrkx":1,"-":41}},{"path":"src/main/java/tutorpro/logic/parser/exceptions/ParseException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Represents a parse error encountered by a parser.","lastModifiedDate":"2017-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class ParseException extends IllegalValueException {","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public ParseException(String message) {","lastModifiedDate":"2017-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2017-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public ParseException(String message, Throwable cause) {","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-03-11"}],"authorContributionMap":{"Wyrkx":2,"-":15}},{"path":"src/main/java/tutorpro/model/AddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.UniquePersonList;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Wraps all data at the address-book level","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Duplicates are not allowed (by .isSamePerson comparison)","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class AddressBook implements ReadOnlyAddressBook {","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final UniquePersonList persons;","lastModifiedDate":"2016-08-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * The \u0027unusual\u0027 code block below is a non-static initialization block, sometimes used to avoid duplication","lastModifiedDate":"2019-05-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * between constructors. See https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html","lastModifiedDate":"2016-10-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Note that non-static init blocks are not recommended to use. There are other ways to avoid duplication","lastModifiedDate":"2016-10-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * among constructors.","lastModifiedDate":"2016-10-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" {","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" persons \u003d new UniquePersonList();","lastModifiedDate":"2016-08-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddressBook() {}","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Creates an AddressBook using the Persons in the {@code toBeCopied}","lastModifiedDate":"2018-03-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public AddressBook(ReadOnlyAddressBook toBeCopied) {","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this();","lastModifiedDate":"2016-12-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" resetData(toBeCopied);","lastModifiedDate":"2016-12-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" //// list overwrite operations","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Replaces the contents of the person list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.persons.setPersons(persons);","lastModifiedDate":"2016-10-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Resets the existing data of this {@code AddressBook} with {@code newData}.","lastModifiedDate":"2017-08-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void resetData(ReadOnlyAddressBook newData) {","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" requireNonNull(newData);","lastModifiedDate":"2017-05-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" setPersons(newData.getPersonList());","lastModifiedDate":"2018-03-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" //// person-level operations","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns true if a person with the same identity as {@code person} exists in the address book.","lastModifiedDate":"2018-08-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return persons.contains(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * The person must not already exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void addPerson(Person p) {","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" persons.add(p);","lastModifiedDate":"2018-03-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Replaces the given person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2018-01-10"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * {@code target} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":84,"author":{"gitId":"-"},"content":" requireNonNull(editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" persons.setPerson(target, editedPerson);","lastModifiedDate":"2018-03-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Removes {@code key} from this {@code AddressBook}.","lastModifiedDate":"2017-08-16"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * {@code key} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void removePerson(Person key) {","lastModifiedDate":"2018-08-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":" persons.remove(key);","lastModifiedDate":"2018-02-28"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" //// util methods","lastModifiedDate":"2016-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .add(\"persons\", persons)","lastModifiedDate":"2019-02-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" return persons.asUnmodifiableObservableList();","lastModifiedDate":"2018-04-05"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-01"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-01"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" if (!(other instanceof AddressBook)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" AddressBook otherAddressBook \u003d (AddressBook) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" return persons.equals(otherAddressBook.persons);","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return persons.hashCode();","lastModifiedDate":"2018-03-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":4,"-":126}},{"path":"src/main/java/tutorpro/model/Model.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * The API of the Model component.","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public interface Model {","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /** {@code Predicate} that always evaluate to true */","lastModifiedDate":"2017-08-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":" Predicate\u003cPerson\u003e PREDICATE_SHOW_ALL_PERSONS \u003d unused -\u003e true;","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Replaces user prefs data with the data in {@code userPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" void setUserPrefs(ReadOnlyUserPrefs userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns the user prefs.","lastModifiedDate":"2018-11-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ReadOnlyUserPrefs getUserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Sets the user prefs\u0027 GUI settings.","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" void setGuiSettings(GuiSettings guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Returns the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Sets the user prefs\u0027 address book file path.","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" void setAddressBookFilePath(Path addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-11-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Replaces address book data with the data in {@code addressBook}.","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" void setAddressBook(ReadOnlyAddressBook addressBook);","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /** Returns the AddressBook */","lastModifiedDate":"2016-09-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook getAddressBook();","lastModifiedDate":"2016-09-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Returns true if a person with the same identity as {@code person} exists in the address book.","lastModifiedDate":"2018-08-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" boolean hasPerson(Person person);","lastModifiedDate":"2018-08-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Deletes the given person.","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * The person must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" void deletePerson(Person target);","lastModifiedDate":"2018-08-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Adds the given person.","lastModifiedDate":"2018-08-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * {@code person} must not already exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" void addPerson(Person person);","lastModifiedDate":"2018-08-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Replaces the given person {@code target} with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * {@code target} must exist in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the address book.","lastModifiedDate":"2018-08-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" void setPerson(Person target, Person editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /** Returns an unmodifiable view of the filtered person list */","lastModifiedDate":"2017-09-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getFilteredPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Updates the filter of the filtered person list to filter by the given {@code predicate}.","lastModifiedDate":"2017-08-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code predicate} is null.","lastModifiedDate":"2017-08-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate);","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"Wyrkx":3,"-":84}},{"path":"src/main/java/tutorpro/model/ModelManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-08-05"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import javafx.collections.transformation.FilteredList;","lastModifiedDate":"2016-08-26"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Represents the in-memory model of the address book data.","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ModelManager implements Model {","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(ModelManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final AddressBook addressBook;","lastModifiedDate":"2019-01-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final UserPrefs userPrefs;","lastModifiedDate":"2018-12-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private final FilteredList\u003cPerson\u003e filteredPersons;","lastModifiedDate":"2018-01-10"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Initializes a ModelManager with the given addressBook and userPrefs.","lastModifiedDate":"2016-12-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(addressBook, userPrefs);","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" logger.fine(\"Initializing with address book: \" + addressBook + \" and user prefs \" + userPrefs);","lastModifiedDate":"2016-12-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.addressBook \u003d new AddressBook(addressBook);","lastModifiedDate":"2019-01-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.userPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" filteredPersons \u003d new FilteredList\u003c\u003e(this.addressBook.getPersonList());","lastModifiedDate":"2019-01-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public ModelManager() {","lastModifiedDate":"2016-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this(new AddressBook(), new UserPrefs());","lastModifiedDate":"2016-09-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d UserPrefs \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":" requireNonNull(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" this.userPrefs.resetData(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return userPrefs;","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return userPrefs.getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" requireNonNull(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return userPrefs.getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" requireNonNull(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AddressBook \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2018-11-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook addressBook) {","lastModifiedDate":"2018-11-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":" this.addressBook.resetData(addressBook);","lastModifiedDate":"2019-01-25"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2019-01-25"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return addressBook.hasPerson(person);","lastModifiedDate":"2019-01-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" addressBook.removePerson(target);","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2019-01-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-26"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-26"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":110,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(target, editedPerson);","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" addressBook.setPerson(target, editedPerson);","lastModifiedDate":"2019-01-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" //\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Filtered Person List Accessors \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-10-12"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-19"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Returns an unmodifiable view of the list of {@code Person} backed by the internal list of","lastModifiedDate":"2018-01-10"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * {@code versionedAddressBook}","lastModifiedDate":"2018-06-11"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-19"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":123,"author":{"gitId":"-"},"content":" return filteredPersons;","lastModifiedDate":"2018-12-09"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":128,"author":{"gitId":"-"},"content":" requireNonNull(predicate);","lastModifiedDate":"2017-08-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":" filteredPersons.setPredicate(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2023-07-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" if (!(other instanceof ModelManager)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":" ModelManager otherModelManager \u003d (ModelManager) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" return addressBook.equals(otherModelManager.addressBook)","lastModifiedDate":"2023-07-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" \u0026\u0026 userPrefs.equals(otherModelManager.userPrefs)","lastModifiedDate":"2023-07-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" \u0026\u0026 filteredPersons.equals(otherModelManager.filteredPersons);","lastModifiedDate":"2023-07-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":6,"-":141}},{"path":"src/main/java/tutorpro/model/ReadOnlyAddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * Unmodifiable view of an address book","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public interface ReadOnlyAddressBook {","lastModifiedDate":"2019-01-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Returns an unmodifiable view of the persons list.","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * This list will not contain any duplicate persons.","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" ObservableList\u003cPerson\u003e getPersonList();","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":15}},{"path":"src/main/java/tutorpro/model/ReadOnlyUserPrefs.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-11-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Unmodifiable view of user prefs.","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public interface ReadOnlyUserPrefs {","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" GuiSettings getGuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-11-27"}],"authorContributionMap":{"Wyrkx":2,"-":14}},{"path":"src/main/java/tutorpro/model/UserPrefs.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Represents User\u0027s preferences.","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class UserPrefs implements ReadOnlyUserPrefs {","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private GuiSettings guiSettings \u003d new GuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private Path addressBookFilePath \u003d Paths.get(\"data\" , \"addressbook.json\");","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with default values.","lastModifiedDate":"2018-12-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public UserPrefs() {}","lastModifiedDate":"2018-12-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with the prefs in {@code userPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public UserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this();","lastModifiedDate":"2018-12-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" resetData(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Resets the existing data of this {@code UserPrefs} with {@code newUserPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData(ReadOnlyUserPrefs newUserPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(newUserPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" setGuiSettings(newUserPrefs.getGuiSettings());","lastModifiedDate":"2018-12-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" setAddressBookFilePath(newUserPrefs.getAddressBookFilePath());","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return guiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.guiSettings \u003d guiSettings;","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" requireNonNull(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.addressBookFilePath \u003d addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" if (!(other instanceof UserPrefs)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" UserPrefs otherUserPrefs \u003d (UserPrefs) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return guiSettings.equals(otherUserPrefs.guiSettings)","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u0026\u0026 addressBookFilePath.equals(otherUserPrefs.addressBookFilePath);","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Objects.hash(guiSettings, addressBookFilePath);","lastModifiedDate":"2018-08-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-02-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" sb.append(\"Gui Settings : \" + guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" sb.append(\"\\nLocal data file location : \" + addressBookFilePath);","lastModifiedDate":"2017-02-25"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":2,"-":86}},{"path":"src/main/java/tutorpro/model/person/Address.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s address in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Address {","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Addresses can take any values, and it should not be blank\";","lastModifiedDate":"2018-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Constructs an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @param address A valid address.","lastModifiedDate":"2017-05-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Address(String address) {","lastModifiedDate":"2017-05-30"},{"lineNumber":30,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" value \u003d address;","lastModifiedDate":"2018-08-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static boolean isValidAddress(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (!(other instanceof Address)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Address otherAddress \u003d (Address) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return value.equals(otherAddress.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":2,"-":62}},{"path":"src/main/java/tutorpro/model/person/Email.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s email in the address book.","lastModifiedDate":"2018-02-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Email {","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2021-07-20"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2018-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2018-02-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2021-07-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"characters.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"2. This is followed by a \u0027@\u0027 and then a domain name. The domain name is made up of domain labels \"","lastModifiedDate":"2021-07-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2021-07-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // alphanumeric and special characters","lastModifiedDate":"2018-02-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2021-07-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2021-07-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2021-07-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String DOMAIN_LAST_PART_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"){2,}$\"; // At least two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Constructs an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":40,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * @param email A valid email address.","lastModifiedDate":"2017-05-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public Email(String email) {","lastModifiedDate":"2017-05-30"},{"lineNumber":44,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-15"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidEmail(email), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" value \u003d email;","lastModifiedDate":"2018-08-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static boolean isValidEmail(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" if (!(other instanceof Email)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" Email otherEmail \u003d (Email) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return value.equals(otherEmail.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":2,"-":76}},{"path":"src/main/java/tutorpro/model/person/Name.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s name in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Name {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2018-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2018-04-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public final String fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code Name}.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @param name A valid name.","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Name(String name) {","lastModifiedDate":"2017-05-30"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidName(name), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" fullName \u003d name;","lastModifiedDate":"2018-08-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid name.","lastModifiedDate":"2018-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static boolean isValidName(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return fullName;","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (!(other instanceof Name)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Name otherName \u003d (Name) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return fullName.equals(otherName.fullName);","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return fullName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":2,"-":64}},{"path":"src/main/java/tutorpro/model/person/NameContainsKeywordsPredicate.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Tests that a {@code Person}\u0027s {@code Name} matches any of the keywords given.","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicate implements Predicate\u003cPerson\u003e {","lastModifiedDate":"2018-01-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final List\u003cString\u003e keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public NameContainsKeywordsPredicate(List\u003cString\u003e keywords) {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" this.keywords \u003d keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public boolean test(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return keywords.stream()","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" .anyMatch(keyword -\u003e StringUtil.containsWordIgnoreCase(person.getName().fullName, keyword));","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!(other instanceof NameContainsKeywordsPredicate)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate otherNameContainsKeywordsPredicate \u003d (NameContainsKeywordsPredicate) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return keywords.equals(otherNameContainsKeywordsPredicate.keywords);","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"keywords\", keywords).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"Wyrkx":3,"-":41}},{"path":"src/main/java/tutorpro/model/person/Person.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public Person(Name name, Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-03-14"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":4,"-":112}},{"path":"src/main/java/tutorpro/model/person/Phone.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s phone number in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Phone {","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2018-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"Phone numbers should only contain numbers, and it should be at least 3 digits long\";","lastModifiedDate":"2018-04-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\d{3,}\";","lastModifiedDate":"2018-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Constructs a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * @param phone A valid phone number.","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Phone(String phone) {","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidPhone(phone), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" value \u003d phone;","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid phone number.","lastModifiedDate":"2018-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static boolean isValidPhone(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!(other instanceof Phone)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Phone otherPhone \u003d (Phone) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return value.equals(otherPhone.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":2,"-":58}},{"path":"src/main/java/tutorpro/model/person/UniquePersonList.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Iterator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.commons.util.CollectionUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A list of persons that enforces uniqueness between its elements and does not allow nulls.","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A person is considered unique by comparing using {@code Person#isSamePerson(Person)}. As such, adding and updating of","lastModifiedDate":"2018-04-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * persons uses Person#isSamePerson(Person) for equality so as to ensure that the person being added or updated is","lastModifiedDate":"2018-04-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * unique in terms of identity in the UniquePersonList. However, the removal of a person uses Person#equals(Object) so","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * as to ensure that the person with exactly the same fields will be removed.","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Supports a minimal set of list operations.","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see Person#isSamePerson(Person)","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class UniquePersonList implements Iterable\u003cPerson\u003e {","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalList \u003d FXCollections.observableArrayList();","lastModifiedDate":"2016-10-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalUnmodifiableList \u003d","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":" FXCollections.unmodifiableObservableList(internalList);","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Returns true if the list contains an equivalent person as the given argument.","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public boolean contains(Person toCheck) {","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(toCheck);","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return internalList.stream().anyMatch(toCheck::isSamePerson);","lastModifiedDate":"2018-04-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Adds a person to the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * The person must not already exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void add(Person toAdd) {","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(toAdd);","lastModifiedDate":"2017-05-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" if (contains(toAdd)) {","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" internalList.add(toAdd);","lastModifiedDate":"2018-01-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Replaces the person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * {@code target} must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(target, editedPerson);","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" int index \u003d internalList.indexOf(target);","lastModifiedDate":"2017-06-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (index \u003d\u003d -1) {","lastModifiedDate":"2017-06-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2017-06-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (!target.isSamePerson(editedPerson) \u0026\u0026 contains(editedPerson)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-12-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" internalList.set(index, editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Removes the equivalent person from the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * The person must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void remove(Person toRemove) {","lastModifiedDate":"2018-08-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" requireNonNull(toRemove);","lastModifiedDate":"2017-05-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (!internalList.remove(toRemove)) {","lastModifiedDate":"2018-02-28"},{"lineNumber":79,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2016-08-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void setPersons(UniquePersonList replacement) {","lastModifiedDate":"2016-10-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" requireNonNull(replacement);","lastModifiedDate":"2018-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" internalList.setAll(replacement.internalList);","lastModifiedDate":"2018-08-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Replaces the contents of this list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(persons);","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (!personsAreUnique(persons)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2018-01-21"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" internalList.setAll(persons);","lastModifiedDate":"2018-08-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-09-01"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Returns the backing list as an unmodifiable {@code ObservableList}.","lastModifiedDate":"2017-09-01"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-09-01"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e asUnmodifiableObservableList() {","lastModifiedDate":"2018-04-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return internalUnmodifiableList;","lastModifiedDate":"2018-12-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public Iterator\u003cPerson\u003e iterator() {","lastModifiedDate":"2016-08-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return internalList.iterator();","lastModifiedDate":"2016-08-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":115,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" if (!(other instanceof UniquePersonList)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" UniquePersonList otherUniquePersonList \u003d (UniquePersonList) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return internalList.equals(otherUniquePersonList.internalList);","lastModifiedDate":"2023-07-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":" return internalList.hashCode();","lastModifiedDate":"2016-09-21"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-24"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return internalList.toString();","lastModifiedDate":"2019-02-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":138,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * Returns true if {@code persons} contains only unique persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":141,"author":{"gitId":"-"},"content":" private boolean personsAreUnique(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-04-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c persons.size() - 1; i++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" for (int j \u003d i + 1; j \u003c persons.size(); j++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" if (persons.get(i).isSamePerson(persons.get(j))) {","lastModifiedDate":"2018-04-19"},{"lineNumber":145,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":149,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":151,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":5,"-":144}},{"path":"src/main/java/tutorpro/model/person/exceptions/DuplicatePersonException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that the operation will result in duplicate Persons (Persons are considered duplicates if they have the same","lastModifiedDate":"2018-04-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":" * identity).","lastModifiedDate":"2018-04-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class DuplicatePersonException extends RuntimeException {","lastModifiedDate":"2018-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" public DuplicatePersonException() {","lastModifiedDate":"2017-06-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" super(\"Operation would result in duplicate persons\");","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"Wyrkx":1,"-":10}},{"path":"src/main/java/tutorpro/model/person/exceptions/PersonNotFoundException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that the operation is unable to find the specified person.","lastModifiedDate":"2017-06-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class PersonNotFoundException extends RuntimeException {}","lastModifiedDate":"2018-08-07"}],"authorContributionMap":{"Wyrkx":1,"-":5}},{"path":"src/main/java/tutorpro/model/tag/Tag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.commons.util.AppUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Tag in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Tag {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Tags names should be alphanumeric\";","lastModifiedDate":"2018-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\p{Alnum}+\";","lastModifiedDate":"2018-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public final String tagName;","lastModifiedDate":"2016-10-19"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Constructs a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param tagName A valid tag name.","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Tag(String tagName) {","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(tagName);","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" AppUtil.checkArgument(isValidTagName(tagName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2017-05-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid tag name.","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static boolean isValidTagName(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (!(other instanceof Tag)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Tag otherTag \u003d (Tag) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return tagName.equals(otherTag.tagName);","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return tagName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Format state as text for viewing.","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return \u0027[\u0027 + tagName + \u0027]\u0027;","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":2,"-":59}},{"path":"src/main/java/tutorpro/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":40,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"Wyrkx":9,"-":51}},{"path":"src/main/java/tutorpro/storage/AddressBookStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" * Represents a storage for {@link AddressBook}.","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public interface AddressBookStorage {","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Returns the file path of the data file.","lastModifiedDate":"2016-09-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns AddressBook data as a {@link ReadOnlyAddressBook}.","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns {@code Optional.empty()} if storage file is not found.","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @see #getAddressBookFilePath()","lastModifiedDate":"2016-10-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Saves the given {@link ReadOnlyAddressBook} to the storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param addressBook cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @throws IOException if there was any problem writing to the file.","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;","lastModifiedDate":"2016-09-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @see #saveAddressBook(ReadOnlyAddressBook)","lastModifiedDate":"2016-10-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException;","lastModifiedDate":"2018-04-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":4,"-":41}},{"path":"src/main/java/tutorpro/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2023-05-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":8,"-":101}},{"path":"src/main/java/tutorpro/storage/JsonAdaptedTag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Tag}.","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"class JsonAdaptedTag {","lastModifiedDate":"2018-12-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final String tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedTag} with the given {@code tagName}.","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public JsonAdaptedTag(String tagName) {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Converts a given {@code Tag} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public JsonAdaptedTag(Tag source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" tagName \u003d source.tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @JsonValue","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public String getTagName() {","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return tagName;","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted tag object into the model\u0027s {@code Tag} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted tag.","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Tag toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(tagName)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new Tag(tagName);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":3,"-":45}},{"path":"src/main/java/tutorpro/storage/JsonAddressBookStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.FileUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.JsonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A class to access AddressBook data stored as a json file on the hard disk.","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorage implements AddressBookStorage {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonAddressBookStorage.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Path filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public JsonAddressBookStorage(Path filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return readAddressBook(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Similar to {@link #readAddressBook()}.","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Optional\u003cJsonSerializableAddressBook\u003e jsonAddressBook \u003d JsonUtil.readJsonFile(","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" filePath, JsonSerializableAddressBook.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!jsonAddressBook.isPresent()) {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return Optional.of(jsonAddressBook.get().toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" logger.info(\"Illegal values found in \" + filePath + \": \" + ive.getMessage());","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" throw new DataLoadingException(ive);","lastModifiedDate":"2023-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Similar to {@link #saveAddressBook(ReadOnlyAddressBook)}.","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" requireNonNull(addressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" FileUtil.createIfMissing(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(new JsonSerializableAddressBook(addressBook), filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":7,"-":73}},{"path":"src/main/java/tutorpro/storage/JsonSerializableAddressBook.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonRootName;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * An Immutable AddressBook that is serializable to JSON format.","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"@JsonRootName(value \u003d \"addressbook\")","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"class JsonSerializableAddressBook {","lastModifiedDate":"2018-12-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"Persons list contains duplicate person(s).\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedPerson\u003e persons \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonSerializableAddressBook} with the given persons.","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(@JsonProperty(\"persons\") List\u003cJsonAdaptedPerson\u003e persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.persons.addAll(persons);","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created {@code JsonSerializableAddressBook}.","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" persons.addAll(source.getPersonList().stream().map(JsonAdaptedPerson::new).collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Converts this address book into the model\u0027s {@code AddressBook} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated.","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public AddressBook toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" for (JsonAdaptedPerson jsonAdaptedPerson : persons) {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Person person \u003d jsonAdaptedPerson.toModelType();","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (addressBook.hasPerson(person)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"Wyrkx":5,"-":55}},{"path":"src/main/java/tutorpro/storage/JsonUserPrefsStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.JsonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * A class to access UserPrefs stored in the hard disk as a json file","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class JsonUserPrefsStorage implements UserPrefsStorage {","lastModifiedDate":"2016-10-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private Path filePath;","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public JsonUserPrefsStorage(Path filePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-02-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2017-02-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" return readUserPrefs(filePath);","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Similar to {@link #readUserPrefs()}","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @param prefsFilePath location of the data. Cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if the file format is not as expected.","lastModifiedDate":"2023-06-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs(Path prefsFilePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return JsonUtil.readJsonFile(prefsFilePath, UserPrefs.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException {","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" JsonUtil.saveJsonFile(userPrefs, filePath);","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":5,"-":42}},{"path":"src/main/java/tutorpro/storage/Storage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * API of the Storage component","lastModifiedDate":"2016-09-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public interface Storage extends AddressBookStorage, UserPrefsStorage {","lastModifiedDate":"2016-09-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException;","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Path getAddressBookFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;","lastModifiedDate":"2016-09-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"Wyrkx":5,"-":27}},{"path":"src/main/java/tutorpro/storage/StorageManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Manages storage of AddressBook data in local storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class StorageManager implements Storage {","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(StorageManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private AddressBookStorage addressBookStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private UserPrefsStorage userPrefsStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates a {@code StorageManager} with the given {@code AddressBookStorage} and {@code UserPrefStorage}.","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public StorageManager(AddressBookStorage addressBookStorage, UserPrefsStorage userPrefsStorage) {","lastModifiedDate":"2016-10-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.addressBookStorage \u003d addressBookStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.userPrefsStorage \u003d userPrefsStorage;","lastModifiedDate":"2016-10-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d UserPrefs methods \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-02-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public Path getUserPrefsFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return userPrefsStorage.getUserPrefsFilePath();","lastModifiedDate":"2017-02-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return userPrefsStorage.readUserPrefs();","lastModifiedDate":"2016-10-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException {","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" userPrefsStorage.saveUserPrefs(userPrefs);","lastModifiedDate":"2016-10-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AddressBook methods \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return addressBookStorage.getAddressBookFilePath();","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return readAddressBook(addressBookStorage.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-01"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" logger.fine(\"Attempting to read data from file: \" + filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return addressBookStorage.readAddressBook(filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, addressBookStorage.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-10-01"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" logger.fine(\"Attempting to write to data file: \" + filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":75,"author":{"gitId":"-"},"content":" addressBookStorage.saveAddressBook(addressBook, filePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":6,"-":72}},{"path":"src/main/java/tutorpro/storage/UserPrefsStorage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" * Represents a storage for {@link UserPrefs}.","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public interface UserPrefsStorage {","lastModifiedDate":"2016-09-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Returns the file path of the UserPrefs data file.","lastModifiedDate":"2017-02-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Path getUserPrefsFilePath();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns UserPrefs data from storage.","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns {@code Optional.empty()} if storage file is not found.","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if the loading of data from preference file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Optional\u003cUserPrefs\u003e readUserPrefs() throws DataLoadingException;","lastModifiedDate":"2023-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-24"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" * Saves the given {@link ReadOnlyUserPrefs} to the storage.","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * @param userPrefs cannot be null.","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @throws IOException if there was any problem writing to the file.","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" void saveUserPrefs(ReadOnlyUserPrefs userPrefs) throws IOException;","lastModifiedDate":"2018-11-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Wyrkx":6,"-":30}},{"path":"src/main/java/tutorpro/ui/CommandBox.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextField;","lastModifiedDate":"2016-09-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * The UI component that is responsible for receiving user command inputs.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class CommandBox extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String ERROR_STYLE_CLASS \u003d \"error\";","lastModifiedDate":"2017-02-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"CommandBox.fxml\";","lastModifiedDate":"2017-04-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final CommandExecutor commandExecutor;","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private TextField commandTextField;","lastModifiedDate":"2016-09-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Creates a {@code CommandBox} with the given {@code CommandExecutor}.","lastModifiedDate":"2020-05-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public CommandBox(CommandExecutor commandExecutor) {","lastModifiedDate":"2019-01-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.commandExecutor \u003d commandExecutor;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // calls #setStyleToDefault() whenever there is a change to the text of the command box.","lastModifiedDate":"2017-06-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" commandTextField.textProperty().addListener((unused1, unused2, unused3) -\u003e setStyleToDefault());","lastModifiedDate":"2017-06-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Handles the Enter button pressed event.","lastModifiedDate":"2017-08-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private void handleCommandEntered() {","lastModifiedDate":"2018-04-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":" String commandText \u003d commandTextField.getText();","lastModifiedDate":"2020-12-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":" if (commandText.equals(\"\")) {","lastModifiedDate":"2020-12-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2020-12-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-12-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-12-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-02-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" commandExecutor.execute(commandText);","lastModifiedDate":"2020-12-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":" commandTextField.setText(\"\");","lastModifiedDate":"2016-09-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" } catch (CommandException | ParseException e) {","lastModifiedDate":"2017-03-11"},{"lineNumber":49,"author":{"gitId":"-"},"content":" setStyleToIndicateCommandFailure();","lastModifiedDate":"2017-02-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Sets the command box style to use the default style.","lastModifiedDate":"2017-06-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private void setStyleToDefault() {","lastModifiedDate":"2017-06-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":" commandTextField.getStyleClass().remove(ERROR_STYLE_CLASS);","lastModifiedDate":"2017-02-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Sets the command box style to indicate a failed command.","lastModifiedDate":"2017-02-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":" private void setStyleToIndicateCommandFailure() {","lastModifiedDate":"2017-02-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" ObservableList\u003cString\u003e styleClass \u003d commandTextField.getStyleClass();","lastModifiedDate":"2017-03-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" if (styleClass.contains(ERROR_STYLE_CLASS)) {","lastModifiedDate":"2017-03-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return;","lastModifiedDate":"2017-03-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" styleClass.add(ERROR_STYLE_CLASS);","lastModifiedDate":"2017-03-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Represents a function that can execute commands.","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @FunctionalInterface","lastModifiedDate":"2018-12-09"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public interface CommandExecutor {","lastModifiedDate":"2018-12-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2018-12-09"},{"lineNumber":80,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" * @see Logic#execute(String)","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":83,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-14"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":3,"-":80}},{"path":"src/main/java/tutorpro/ui/HelpWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-12-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Button;","lastModifiedDate":"2019-08-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2019-08-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.input.Clipboard;","lastModifiedDate":"2019-08-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.input.ClipboardContent;","lastModifiedDate":"2019-08-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Controller for a help page","lastModifiedDate":"2016-08-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class HelpWindow extends UiPart\u003cStage\u003e {","lastModifiedDate":"2017-12-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String USERGUIDE_URL \u003d \"https://se-education.org/addressbook-level3/UserGuide.html\";","lastModifiedDate":"2019-08-19"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String HELP_MESSAGE \u003d \"Refer to the user guide: \" + USERGUIDE_URL;","lastModifiedDate":"2019-08-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(HelpWindow.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"HelpWindow.fxml\";","lastModifiedDate":"2016-09-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Button copyButton;","lastModifiedDate":"2019-08-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-08-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2019-08-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Label helpMessage;","lastModifiedDate":"2019-08-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-12-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Creates a new HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-12-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @param root Stage to use as the root of the HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-12-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public HelpWindow(Stage root) {","lastModifiedDate":"2017-12-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":" super(FXML, root);","lastModifiedDate":"2017-12-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":" helpMessage.setText(HELP_MESSAGE);","lastModifiedDate":"2019-08-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-12-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Creates a new HelpWindow.","lastModifiedDate":"2017-12-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-12-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public HelpWindow() {","lastModifiedDate":"2017-12-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this(new Stage());","lastModifiedDate":"2017-12-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-01"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Shows the help window.","lastModifiedDate":"2017-08-16"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * @throws IllegalStateException","lastModifiedDate":"2017-08-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * \u003cul\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * if this method is called on a thread other than the JavaFX Application Thread.","lastModifiedDate":"2017-08-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * if this method is called during animation or layout processing.","lastModifiedDate":"2017-08-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * if this method is called on the primary stage.","lastModifiedDate":"2017-08-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * \u003cli\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * if {@code dialogStage} is already showing.","lastModifiedDate":"2017-08-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * \u003c/li\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * \u003c/ul\u003e","lastModifiedDate":"2017-08-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void show() {","lastModifiedDate":"2016-08-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.fine(\"Showing help page about the application.\");","lastModifiedDate":"2016-12-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" getRoot().show();","lastModifiedDate":"2018-02-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" getRoot().centerOnScreen();","lastModifiedDate":"2019-08-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-15"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Returns true if the help window is currently being shown.","lastModifiedDate":"2018-03-15"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-15"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public boolean isShowing() {","lastModifiedDate":"2018-03-15"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return getRoot().isShowing();","lastModifiedDate":"2018-03-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Hides the help window.","lastModifiedDate":"2018-12-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hide() {","lastModifiedDate":"2018-12-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" getRoot().hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Focuses on the help window.","lastModifiedDate":"2018-03-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void focus() {","lastModifiedDate":"2018-03-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" getRoot().requestFocus();","lastModifiedDate":"2018-03-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-08-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-08-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Copies the URL to the user guide to the clipboard.","lastModifiedDate":"2019-08-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-08-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2019-08-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private void copyUrl() {","lastModifiedDate":"2019-08-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" final Clipboard clipboard \u003d Clipboard.getSystemClipboard();","lastModifiedDate":"2019-08-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" final ClipboardContent url \u003d new ClipboardContent();","lastModifiedDate":"2019-08-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" url.putString(USERGUIDE_URL);","lastModifiedDate":"2019-08-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" clipboard.setContent(url);","lastModifiedDate":"2019-08-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-08-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":2,"-":100}},{"path":"src/main/java/tutorpro/ui/MainWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-06-16"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.event.ActionEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.MenuItem;","lastModifiedDate":"2016-08-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextInputControl;","lastModifiedDate":"2016-12-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyCombination;","lastModifiedDate":"2016-08-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import javafx.scene.layout.StackPane;","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * The Main Window. Provides the basic application layout containing","lastModifiedDate":"2016-08-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * a menu bar and space where other JavaFX elements can be placed.","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class MainWindow extends UiPart\u003cStage\u003e {","lastModifiedDate":"2017-11-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"MainWindow.fxml\";","lastModifiedDate":"2016-08-18"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(getClass());","lastModifiedDate":"2018-08-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Stage primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // Independent Ui parts residing in this Ui container","lastModifiedDate":"2016-08-18"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private PersonListPanel personListPanel;","lastModifiedDate":"2016-08-18"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private ResultDisplay resultDisplay;","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private HelpWindow helpWindow;","lastModifiedDate":"2018-03-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private StackPane commandBoxPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private MenuItem helpMenuItem;","lastModifiedDate":"2016-08-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private StackPane personListPanelPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private StackPane resultDisplayPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private StackPane statusbarPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Creates a {@code MainWindow} with the given {@code Stage} and {@code Logic}.","lastModifiedDate":"2020-05-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public MainWindow(Stage primaryStage, Logic logic) {","lastModifiedDate":"2018-12-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" super(FXML, primaryStage);","lastModifiedDate":"2017-11-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // Set dependencies","lastModifiedDate":"2016-09-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.primaryStage \u003d primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.logic \u003d logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // Configure the UI","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" setWindowDefaultSize(logic.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" setAccelerators();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" helpWindow \u003d new HelpWindow();","lastModifiedDate":"2018-03-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public Stage getPrimaryStage() {","lastModifiedDate":"2016-12-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return primaryStage;","lastModifiedDate":"2016-12-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private void setAccelerators() {","lastModifiedDate":"2016-09-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" setAccelerator(helpMenuItem, KeyCombination.valueOf(\"F1\"));","lastModifiedDate":"2016-12-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":79,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-18"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * Sets the accelerator of a MenuItem.","lastModifiedDate":"2016-12-18"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @param keyCombination the KeyCombination value of the accelerator","lastModifiedDate":"2016-12-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private void setAccelerator(MenuItem menuItem, KeyCombination keyCombination) {","lastModifiedDate":"2016-12-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":" menuItem.setAccelerator(keyCombination);","lastModifiedDate":"2016-12-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-12-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * TODO: the code below can be removed once the bug reported here","lastModifiedDate":"2016-12-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * https://bugs.openjdk.java.net/browse/JDK-8131666","lastModifiedDate":"2016-12-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * is fixed in later version of SDK.","lastModifiedDate":"2016-12-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * According to the bug report, TextInputControl (TextField, TextArea) will","lastModifiedDate":"2016-12-18"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * consume function-key events. Because CommandBox contains a TextField, and","lastModifiedDate":"2016-12-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * ResultDisplay contains a TextArea, thus some accelerators (e.g F1) will","lastModifiedDate":"2016-12-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * not work when the focus is in them because the key event is consumed by","lastModifiedDate":"2016-12-18"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * the TextInputControl(s).","lastModifiedDate":"2016-12-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * For now, we add following event filter to capture such key events and open","lastModifiedDate":"2016-12-18"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * help window purposely so to support accelerators even when focus is","lastModifiedDate":"2016-12-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * in CommandBox or ResultDisplay.","lastModifiedDate":"2016-12-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" getRoot().addEventFilter(KeyEvent.KEY_PRESSED, event -\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" if (event.getTarget() instanceof TextInputControl \u0026\u0026 keyCombination.match(event)) {","lastModifiedDate":"2016-12-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" menuItem.getOnAction().handle(new ActionEvent());","lastModifiedDate":"2016-12-18"},{"lineNumber":104,"author":{"gitId":"-"},"content":" event.consume();","lastModifiedDate":"2016-12-18"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":106,"author":{"gitId":"-"},"content":" });","lastModifiedDate":"2016-12-18"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Fills up all the placeholders of this window.","lastModifiedDate":"2017-08-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" void fillInnerParts() {","lastModifiedDate":"2016-09-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" personListPanel \u003d new PersonListPanel(logic.getFilteredPersonList());","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" personListPanelPlaceholder.getChildren().add(personListPanel.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" resultDisplay \u003d new ResultDisplay();","lastModifiedDate":"2018-12-09"},{"lineNumber":117,"author":{"gitId":"-"},"content":" resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" StatusBarFooter statusBarFooter \u003d new StatusBarFooter(logic.getAddressBookFilePath());","lastModifiedDate":"2019-01-25"},{"lineNumber":120,"author":{"gitId":"-"},"content":" statusbarPlaceholder.getChildren().add(statusBarFooter.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" CommandBox commandBox \u003d new CommandBox(this::executeCommand);","lastModifiedDate":"2019-01-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" commandBoxPlaceholder.getChildren().add(commandBox.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":127,"author":{"gitId":"-"},"content":" * Sets the default size based on {@code guiSettings}.","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":129,"author":{"gitId":"-"},"content":" private void setWindowDefaultSize(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":130,"author":{"gitId":"-"},"content":" primaryStage.setHeight(guiSettings.getWindowHeight());","lastModifiedDate":"2018-11-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" primaryStage.setWidth(guiSettings.getWindowWidth());","lastModifiedDate":"2018-11-27"},{"lineNumber":132,"author":{"gitId":"-"},"content":" if (guiSettings.getWindowCoordinates() !\u003d null) {","lastModifiedDate":"2018-11-27"},{"lineNumber":133,"author":{"gitId":"-"},"content":" primaryStage.setX(guiSettings.getWindowCoordinates().getX());","lastModifiedDate":"2018-11-27"},{"lineNumber":134,"author":{"gitId":"-"},"content":" primaryStage.setY(guiSettings.getWindowCoordinates().getY());","lastModifiedDate":"2018-11-27"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":138,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * Opens the help window or focuses on it if it\u0027s already opened.","lastModifiedDate":"2018-03-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":142,"author":{"gitId":"-"},"content":" public void handleHelp() {","lastModifiedDate":"2016-08-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":" if (!helpWindow.isShowing()) {","lastModifiedDate":"2018-03-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" helpWindow.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" helpWindow.focus();","lastModifiedDate":"2018-03-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":150,"author":{"gitId":"-"},"content":" void show() {","lastModifiedDate":"2016-10-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" primaryStage.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":152,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":154,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":155,"author":{"gitId":"-"},"content":" * Closes the application.","lastModifiedDate":"2016-08-18"},{"lineNumber":156,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":157,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":158,"author":{"gitId":"-"},"content":" private void handleExit() {","lastModifiedDate":"2016-08-18"},{"lineNumber":159,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(primaryStage.getWidth(), primaryStage.getHeight(),","lastModifiedDate":"2018-12-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":" (int) primaryStage.getX(), (int) primaryStage.getY());","lastModifiedDate":"2018-12-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" logic.setGuiSettings(guiSettings);","lastModifiedDate":"2018-12-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" helpWindow.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":" primaryStage.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-25"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public PersonListPanel getPersonListPanel() {","lastModifiedDate":"2016-08-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return personListPanel;","lastModifiedDate":"2018-08-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-25"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":170,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2018-12-09"},{"lineNumber":172,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-09"},{"lineNumber":173,"author":{"gitId":"Wyrkx"},"content":" * @see Logic#execute(String)","lastModifiedDate":"2024-03-11"},{"lineNumber":174,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":" private CommandResult executeCommand(String commandText) throws CommandException, ParseException {","lastModifiedDate":"2018-12-09"},{"lineNumber":176,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-12-09"},{"lineNumber":177,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d logic.execute(commandText);","lastModifiedDate":"2018-12-09"},{"lineNumber":178,"author":{"gitId":"-"},"content":" logger.info(\"Result: \" + commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":179,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":181,"author":{"gitId":"-"},"content":" if (commandResult.isShowHelp()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":182,"author":{"gitId":"-"},"content":" handleHelp();","lastModifiedDate":"2018-12-09"},{"lineNumber":183,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":185,"author":{"gitId":"-"},"content":" if (commandResult.isExit()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":186,"author":{"gitId":"-"},"content":" handleExit();","lastModifiedDate":"2018-12-09"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":190,"author":{"gitId":"-"},"content":" } catch (CommandException | ParseException e) {","lastModifiedDate":"2018-12-09"},{"lineNumber":191,"author":{"gitId":"-"},"content":" logger.info(\"An error occurred while executing command: \" + commandText);","lastModifiedDate":"2023-06-13"},{"lineNumber":192,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(e.getMessage());","lastModifiedDate":"2018-12-09"},{"lineNumber":193,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2018-12-09"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":8,"-":188}},{"path":"src/main/java/tutorpro/ui/PersonCard.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Comparator;","lastModifiedDate":"2019-01-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-01-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.FlowPane;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2016-09-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see \u003ca href\u003d\"https://github.com/se-edu/addressbook-level4/issues/336\"\u003eThe issue on AddressBook level 4\u003c/a\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" name.setText(person.getName().fullName);","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" phone.setText(person.getPhone().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":53,"author":{"gitId":"-"},"content":" address.setText(person.getAddress().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" email.setText(person.getEmail().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .sorted(Comparator.comparing(tag -\u003e tag.tagName))","lastModifiedDate":"2019-01-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.tagName)));","lastModifiedDate":"2019-01-02"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"Wyrkx":2,"-":57}},{"path":"src/main/java/tutorpro/ui/PersonListPanel.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-25"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.ListCell;","lastModifiedDate":"2016-09-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.control.ListView;","lastModifiedDate":"2016-08-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Panel containing the list of persons.","lastModifiedDate":"2016-09-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonListPanel extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListPanel.fxml\";","lastModifiedDate":"2016-09-14"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(PersonListPanel.class);","lastModifiedDate":"2017-04-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private ListView\u003cPerson\u003e personListView;","lastModifiedDate":"2018-02-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates a {@code PersonListPanel} with the given {@code ObservableList}.","lastModifiedDate":"2020-05-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public PersonListPanel(ObservableList\u003cPerson\u003e personList) {","lastModifiedDate":"2019-01-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" personListView.setItems(personList);","lastModifiedDate":"2018-02-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" personListView.setCellFactory(listView -\u003e new PersonListViewCell());","lastModifiedDate":"2016-08-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Custom {@code ListCell} that displays the graphics of a {@code Person} using a {@code PersonCard}.","lastModifiedDate":"2018-02-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" class PersonListViewCell extends ListCell\u003cPerson\u003e {","lastModifiedDate":"2018-02-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" protected void updateItem(Person person, boolean empty) {","lastModifiedDate":"2018-02-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" super.updateItem(person, empty);","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" if (empty || person \u003d\u003d null) {","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" setGraphic(null);","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" setText(null);","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" setGraphic(new PersonCard(person, getIndex() + 1).getRoot());","lastModifiedDate":"2018-02-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":3,"-":46}},{"path":"src/main/java/tutorpro/ui/ResultDisplay.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-12-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextArea;","lastModifiedDate":"2016-09-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * A ui for the status bar that is displayed at the header of the application.","lastModifiedDate":"2016-09-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class ResultDisplay extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"ResultDisplay.fxml\";","lastModifiedDate":"2016-09-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-10-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private TextArea resultDisplay;","lastModifiedDate":"2016-10-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public ResultDisplay() {","lastModifiedDate":"2017-06-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":1,"-":27}},{"path":"src/main/java/tutorpro/ui/StatusBarFooter.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2018-12-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * A ui for the status bar that is displayed at the footer of the application.","lastModifiedDate":"2016-09-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class StatusBarFooter extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"StatusBarFooter.fxml\";","lastModifiedDate":"2017-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private Label saveLocationStatus;","lastModifiedDate":"2018-12-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Creates a {@code StatusBarFooter} with the given {@code Path}.","lastModifiedDate":"2020-05-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public StatusBarFooter(Path saveLocation) {","lastModifiedDate":"2019-01-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2017-04-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" saveLocationStatus.setText(Paths.get(\".\").resolve(saveLocation).toString());","lastModifiedDate":"2018-12-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":27}},{"path":"src/main/java/tutorpro/ui/Ui.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-09-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-25"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * API of UI component","lastModifiedDate":"2016-09-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public interface Ui {","lastModifiedDate":"2016-09-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":" /** Starts the UI (and the App). */","lastModifiedDate":"2016-09-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":" void start(Stage primaryStage);","lastModifiedDate":"2016-09-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-25"}],"authorContributionMap":{"Wyrkx":1,"-":12}},{"path":"src/main/java/tutorpro/ui/UiManager.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.application.Platform;","lastModifiedDate":"2016-08-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Alert;","lastModifiedDate":"2016-08-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.control.Alert.AlertType;","lastModifiedDate":"2016-08-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.image.Image;","lastModifiedDate":"2016-08-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.LogsCenter;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.StringUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The manager of the UI component.","lastModifiedDate":"2016-09-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class UiManager implements Ui {","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String ALERT_DIALOG_PANE_FIELD_ID \u003d \"alertDialogPane\";","lastModifiedDate":"2017-04-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(UiManager.class);","lastModifiedDate":"2016-09-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String ICON_APPLICATION \u003d \"/images/address_book_32.png\";","lastModifiedDate":"2016-08-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private MainWindow mainWindow;","lastModifiedDate":"2016-08-18"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Creates a {@code UiManager} with the given {@code Logic}.","lastModifiedDate":"2020-05-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public UiManager(Logic logic) {","lastModifiedDate":"2018-12-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.logic \u003d logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void start(Stage primaryStage) {","lastModifiedDate":"2016-09-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" logger.info(\"Starting UI...\");","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":" //Set the application icon.","lastModifiedDate":"2016-08-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":" primaryStage.getIcons().add(getImage(ICON_APPLICATION));","lastModifiedDate":"2016-08-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":42,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-08-18"},{"lineNumber":43,"author":{"gitId":"-"},"content":" mainWindow \u003d new MainWindow(primaryStage, logic);","lastModifiedDate":"2018-12-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" mainWindow.show(); //This should be called before creating other UI parts","lastModifiedDate":"2016-08-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" mainWindow.fillInnerParts();","lastModifiedDate":"2016-08-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" } catch (Throwable e) {","lastModifiedDate":"2016-08-18"},{"lineNumber":48,"author":{"gitId":"-"},"content":" logger.severe(StringUtil.getDetails(e));","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" showFatalErrorDialogAndShutdown(\"Fatal error during initializing\", e);","lastModifiedDate":"2016-08-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private Image getImage(String imagePath) {","lastModifiedDate":"2016-08-18"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new Image(MainApp.class.getResourceAsStream(imagePath));","lastModifiedDate":"2016-08-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" void showAlertDialogAndWait(Alert.AlertType type, String title, String headerText, String contentText) {","lastModifiedDate":"2016-09-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" showAlertDialogAndWait(mainWindow.getPrimaryStage(), type, title, headerText, contentText);","lastModifiedDate":"2016-08-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Shows an alert dialog on {@code owner} with the given parameters.","lastModifiedDate":"2017-08-16"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * This method only returns after the user has closed the alert dialog.","lastModifiedDate":"2017-08-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static void showAlertDialogAndWait(Stage owner, AlertType type, String title, String headerText,","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String contentText) {","lastModifiedDate":"2016-08-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" final Alert alert \u003d new Alert(type);","lastModifiedDate":"2016-08-18"},{"lineNumber":68,"author":{"gitId":"-"},"content":" alert.getDialogPane().getStylesheets().add(\"view/DarkTheme.css\");","lastModifiedDate":"2016-08-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" alert.initOwner(owner);","lastModifiedDate":"2016-08-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" alert.setTitle(title);","lastModifiedDate":"2016-08-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" alert.setHeaderText(headerText);","lastModifiedDate":"2016-08-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":" alert.setContentText(contentText);","lastModifiedDate":"2016-08-18"},{"lineNumber":73,"author":{"gitId":"-"},"content":" alert.getDialogPane().setId(ALERT_DIALOG_PANE_FIELD_ID);","lastModifiedDate":"2016-10-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" alert.showAndWait();","lastModifiedDate":"2016-08-18"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * Shows an error alert dialog with {@code title} and error message, {@code e},","lastModifiedDate":"2017-08-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * and exits the application after the user has closed the alert dialog.","lastModifiedDate":"2017-08-16"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private void showFatalErrorDialogAndShutdown(String title, Throwable e) {","lastModifiedDate":"2016-09-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" logger.severe(title + \" \" + e.getMessage() + StringUtil.getDetails(e));","lastModifiedDate":"2016-09-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" showAlertDialogAndWait(Alert.AlertType.ERROR, title, e.getMessage(), e.toString());","lastModifiedDate":"2016-08-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Platform.exit();","lastModifiedDate":"2016-08-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" System.exit(1);","lastModifiedDate":"2016-08-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":5,"-":83}},{"path":"src/main/java/tutorpro/ui/UiPart.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-12-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.net.URL;","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.fxml.FXMLLoader;","lastModifiedDate":"2016-12-21"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Represents a distinct part of the UI. e.g. Windows, dialogs, panels, status bars, etc.","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It contains a scene graph with a root node of type {@code T}.","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public abstract class UiPart\u003cT\u003e {","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /** Resource folder where FXML files are stored. */","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String FXML_FILE_FOLDER \u003d \"/view/\";","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final FXMLLoader fxmlLoader \u003d new FXMLLoader();","lastModifiedDate":"2017-11-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file URL.","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * The FXML file must not specify the {@code fx:controller} attribute.","lastModifiedDate":"2016-12-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public UiPart(URL fxmlFileUrl) {","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" loadFxmlFile(fxmlFileUrl, null);","lastModifiedDate":"2017-11-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Constructs a UiPart using the specified FXML file within {@link #FXML_FILE_FOLDER}.","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @see #UiPart(URL)","lastModifiedDate":"2016-12-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public UiPart(String fxmlFileName) {","lastModifiedDate":"2016-12-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this(getFxmlFileUrl(fxmlFileName));","lastModifiedDate":"2017-11-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file URL and root object.","lastModifiedDate":"2017-11-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * The FXML file must not specify the {@code fx:controller} attribute.","lastModifiedDate":"2017-11-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public UiPart(URL fxmlFileUrl, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" loadFxmlFile(fxmlFileUrl, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Constructs a UiPart with the specified FXML file within {@link #FXML_FILE_FOLDER} and root object.","lastModifiedDate":"2017-11-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * @see #UiPart(URL, T)","lastModifiedDate":"2017-11-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public UiPart(String fxmlFileName, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this(getFxmlFileUrl(fxmlFileName), root);","lastModifiedDate":"2017-11-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Returns the root object of the scene graph of this UiPart.","lastModifiedDate":"2016-12-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public T getRoot() {","lastModifiedDate":"2016-12-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return fxmlLoader.getRoot();","lastModifiedDate":"2016-12-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Loads the object hierarchy from a FXML document.","lastModifiedDate":"2017-11-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @param location Location of the FXML document.","lastModifiedDate":"2017-11-29"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @param root Specifies the root of the object hierarchy.","lastModifiedDate":"2017-11-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private void loadFxmlFile(URL location, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":" requireNonNull(location);","lastModifiedDate":"2017-11-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":" fxmlLoader.setLocation(location);","lastModifiedDate":"2017-11-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":" fxmlLoader.setController(this);","lastModifiedDate":"2017-11-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" fxmlLoader.setRoot(root);","lastModifiedDate":"2017-11-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-11-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":" fxmlLoader.load();","lastModifiedDate":"2017-11-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2017-11-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new AssertionError(e);","lastModifiedDate":"2017-11-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-11-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Returns the FXML file URL for the specified FXML file name within {@link #FXML_FILE_FOLDER}.","lastModifiedDate":"2017-11-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-11-29"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static URL getFxmlFileUrl(String fxmlFileName) {","lastModifiedDate":"2017-11-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" requireNonNull(fxmlFileName);","lastModifiedDate":"2017-11-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":" String fxmlFileNameWithFolder \u003d FXML_FILE_FOLDER + fxmlFileName;","lastModifiedDate":"2017-11-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":" URL fxmlFileUrl \u003d MainApp.class.getResource(fxmlFileNameWithFolder);","lastModifiedDate":"2017-11-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return requireNonNull(fxmlFileUrl);","lastModifiedDate":"2017-11-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"Wyrkx":2,"-":86}},{"path":"src/test/java/tutorpro/AppParametersTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-04-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Map;","lastModifiedDate":"2018-04-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import javafx.application.Application;","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class AppParametersTest {","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private final ParametersStub parametersStub \u003d new ParametersStub();","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final AppParameters expected \u003d new AppParameters();","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void parse_validConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", \"config.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":" expected.setConfigPath(Paths.get(\"config.json\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void parse_nullConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", null);","lastModifiedDate":"2018-04-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void parse_invalidConfigPath_success() {","lastModifiedDate":"2018-04-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" parametersStub.namedParameters.put(\"config\", \"a\\0\");","lastModifiedDate":"2018-04-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expected.setConfigPath(null);","lastModifiedDate":"2018-04-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(expected, AppParameters.parse(parametersStub));","lastModifiedDate":"2018-04-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"agreatdayy"},"content":" String expected \u003d AppParameters.class.getCanonicalName()","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"agreatdayy"},"content":" + \"{configPath\u003d\" + appParameters.getConfigPath() + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertEquals(expected, appParameters.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AppParameters appParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertTrue(appParameters.equals(new AppParameters()));","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(appParameters.equals(appParameters));","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different config path -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" AppParameters otherAppParameters \u003d new AppParameters();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" otherAppParameters.setConfigPath(Paths.get(\"configPath\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertFalse(appParameters.equals(otherAppParameters));","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static class ParametersStub extends Application.Parameters {","lastModifiedDate":"2018-04-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" private Map\u003cString, String\u003e namedParameters \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getRaw() {","lastModifiedDate":"2018-04-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":" throw new AssertionError(\"should not be called\");","lastModifiedDate":"2018-04-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getUnnamed() {","lastModifiedDate":"2018-04-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new AssertionError(\"should not be called\");","lastModifiedDate":"2018-04-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-04-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public Map\u003cString, String\u003e getNamed() {","lastModifiedDate":"2018-04-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return Collections.unmodifiableMap(namedParameters);","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":90,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-04-21"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":1,"-":87}},{"path":"src/test/java/tutorpro/commons/core/ConfigTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class ConfigTest {","lastModifiedDate":"2016-09-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" Config config \u003d new Config();","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" String expected \u003d Config.class.getCanonicalName() + \"{logLevel\u003d\" + config.getLogLevel()","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \", userPrefsFilePath\u003d\" + config.getUserPrefsFilePath() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" assertEquals(expected, config.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public void equalsMethod() {","lastModifiedDate":"2016-09-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Config defaultConfig \u003d new Config();","lastModifiedDate":"2016-09-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertNotNull(defaultConfig);","lastModifiedDate":"2016-10-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertTrue(defaultConfig.equals(defaultConfig));","lastModifiedDate":"2016-09-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-30"}],"authorContributionMap":{"Wyrkx":1,"-":26}},{"path":"src/test/java/tutorpro/commons/core/GuiSettingsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"public class GuiSettingsTest {","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings();","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" String expected \u003d GuiSettings.class.getCanonicalName() + \"{windowWidth\u003d\" + guiSettings.getWindowWidth()","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" + \", windowHeight\u003d\" + guiSettings.getWindowHeight() + \", windowCoordinates\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + guiSettings.getWindowCoordinates() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertEquals(expected, guiSettings.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2019-02-23"}],"authorContributionMap":{"Wyrkx":1,"-":15}},{"path":"src/test/java/tutorpro/commons/core/VersionTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class VersionTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public void versionParsing_acceptableVersionString_parsedVersionCorrectly() {","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V0.0.0ea\", 0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V3.10.2\", 3, 10, 2, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" verifyVersionParsedCorrectly(\"V100.100.100ea\", 100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void versionParsing_wrongVersionString_throwIllegalArgumentException() {","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e Version.fromString(\"This is not a version string\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void versionConstructor_correctParameter_valueAsExpected() {","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" Version version \u003d new Version(19, 10, 20, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(19, version.getMajor());","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertEquals(10, version.getMinor());","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertEquals(20, version.getPatch());","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertEquals(true, version.isEarlyAccess());","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void versionToString_validVersion_correctStringRepresentation() {","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // boundary at 0","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Version version \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(\"V0.0.0ea\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // normal values","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" version \u003d new Version(4, 10, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(\"V4.10.5\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // big numbers","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" version \u003d new Version(100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertEquals(\"V100.100.100ea\", version.toString());","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_compareToIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Version one;","lastModifiedDate":"2017-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Version another;","lastModifiedDate":"2017-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // Tests equality","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003d\u003d 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" one \u003d new Version(11, 12, 13, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" another \u003d new Version(11, 12, 13, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003d\u003d 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // Tests different patch","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // Tests different minor","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 5, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // Tests different major","lastModifiedDate":"2016-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" one \u003d new Version(10, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" // Tests high major vs low minor","lastModifiedDate":"2016-08-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" one \u003d new Version(10, 0, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 1, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003e 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // Tests high patch vs low minor","lastModifiedDate":"2016-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 10, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 1, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // Tests same major minor different patch","lastModifiedDate":"2016-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // Tests early access vs not early access on same version number","lastModifiedDate":"2016-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" // Tests early access lower version vs not early access higher version compare by version number first","lastModifiedDate":"2016-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" // Tests early access higher version vs not early access lower version compare by version number first","lastModifiedDate":"2016-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" one \u003d new Version(2, 15, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" another \u003d new Version(2, 15, 5, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertTrue(one.compareTo(another) \u003c 0);","lastModifiedDate":"2016-08-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_hashCodeIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" Version version \u003d new Version(100, 100, 100, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" assertEquals(100100100, version.hashCode());","lastModifiedDate":"2016-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" version \u003d new Version(10, 10, 10, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertEquals(1010010010, version.hashCode());","lastModifiedDate":"2016-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public void versionComparable_validVersion_equalIsCorrect() {","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" Version one;","lastModifiedDate":"2016-10-16"},{"lineNumber":122,"author":{"gitId":"-"},"content":" Version another;","lastModifiedDate":"2016-10-16"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" one \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" another \u003d new Version(0, 0, 0, false);","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertTrue(one.equals(another));","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" one \u003d new Version(100, 191, 275, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" another \u003d new Version(100, 191, 275, true);","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertTrue(one.equals(another));","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" private void verifyVersionParsedCorrectly(String versionString,","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" int major, int minor, int patch, boolean isEarlyAccess) {","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertEquals(new Version(major, minor, patch, isEarlyAccess), Version.fromString(versionString));","lastModifiedDate":"2016-08-08"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":3,"-":133}},{"path":"src/test/java/tutorpro/commons/core/index/IndexTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.core.index;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class IndexTest {","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public void createOneBasedIndex() {","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" // invalid index","lastModifiedDate":"2017-05-24"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IndexOutOfBoundsException.class, () -\u003e Index.fromOneBased(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // check equality using the same base","lastModifiedDate":"2017-05-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertEquals(1, Index.fromOneBased(1).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" assertEquals(5, Index.fromOneBased(5).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // convert from one-based index to zero-based index","lastModifiedDate":"2017-05-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertEquals(0, Index.fromOneBased(1).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertEquals(4, Index.fromOneBased(5).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void createZeroBasedIndex() {","lastModifiedDate":"2017-05-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // invalid index","lastModifiedDate":"2017-05-24"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IndexOutOfBoundsException.class, () -\u003e Index.fromZeroBased(-1));","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // check equality using the same base","lastModifiedDate":"2017-05-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertEquals(0, Index.fromZeroBased(0).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertEquals(5, Index.fromZeroBased(5).getZeroBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // convert from zero-based index to one-based index","lastModifiedDate":"2017-05-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertEquals(1, Index.fromZeroBased(0).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(6, Index.fromZeroBased(5).getOneBased());","lastModifiedDate":"2017-05-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-05-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" final Index fifthPersonIndex \u003d Index.fromOneBased(5);","lastModifiedDate":"2017-05-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(Index.fromOneBased(5)));","lastModifiedDate":"2017-05-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(Index.fromZeroBased(4)));","lastModifiedDate":"2017-05-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertTrue(fifthPersonIndex.equals(fifthPersonIndex));","lastModifiedDate":"2017-05-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(null));","lastModifiedDate":"2017-05-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(5.0f));","lastModifiedDate":"2017-05-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertFalse(fifthPersonIndex.equals(Index.fromOneBased(1)));","lastModifiedDate":"2017-05-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromZeroBased(0);","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String expected \u003d Index.class.getCanonicalName() + \"{zeroBasedIndex\u003d\" + index.getZeroBased() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertEquals(expected, index.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":4,"-":64}},{"path":"src/test/java/tutorpro/commons/util/AppUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class AppUtilTest {","lastModifiedDate":"2016-09-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void getImage_exitingImage() {","lastModifiedDate":"2016-09-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertNotNull(AppUtil.getImage(\"/images/address_book_32.png\"));","lastModifiedDate":"2016-09-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void getImage_nullGiven_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e AppUtil.getImage(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void checkArgument_true_nothingHappens() {","lastModifiedDate":"2017-05-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" AppUtil.checkArgument(true);","lastModifiedDate":"2017-05-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" AppUtil.checkArgument(true, \"\");","lastModifiedDate":"2017-05-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void checkArgument_falseWithoutErrorMessage_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e AppUtil.checkArgument(false));","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public void checkArgument_falseWithErrorMessage_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":" String errorMessage \u003d \"error message\";","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(IllegalArgumentException.class,","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"agreatdayy"},"content":" errorMessage, () -\u003e AppUtil.checkArgument(false, errorMessage));","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-30"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":4,"-":32}},{"path":"src/test/java/tutorpro/commons/util/CollectionUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2016-12-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-14"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class CollectionUtilTest {","lastModifiedDate":"2016-12-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void requireAllNonNullVarargs() {","lastModifiedDate":"2017-05-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // no arguments","lastModifiedDate":"2017-01-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown();","lastModifiedDate":"2017-05-19"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // any non-empty argument list","lastModifiedDate":"2017-01-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(new Object(), new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(\"test\");","lastModifiedDate":"2017-05-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(\"\");","lastModifiedDate":"2017-05-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // argument lists with just one null at the beginning","lastModifiedDate":"2017-01-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Object) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(null, \"\", new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(null, new Object(), new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // argument lists with nulls in the middle","lastModifiedDate":"2017-01-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(new Object(), null, null, \"test\");","lastModifiedDate":"2017-05-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(\"\", null, new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // argument lists with one null as the last argument","lastModifiedDate":"2017-01-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(\"\", new Object(), null);","lastModifiedDate":"2017-05-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(new Object(), new Object(), null);","lastModifiedDate":"2017-05-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // null reference","lastModifiedDate":"2017-05-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Object[]) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // confirms nulls inside lists in the argument list are not considered","lastModifiedDate":"2017-01-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" List\u003cObject\u003e containingNull \u003d Arrays.asList((Object) null);","lastModifiedDate":"2017-01-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(containingNull, new Object());","lastModifiedDate":"2017-05-19"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void requireAllNonNullCollection() {","lastModifiedDate":"2017-05-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // lists containing nulls in the front","lastModifiedDate":"2017-01-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList((Object) null));","lastModifiedDate":"2017-05-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(null, new Object(), \"\"));","lastModifiedDate":"2017-05-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // lists containing nulls in the middle","lastModifiedDate":"2017-01-14"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", null, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", null, \"eggs\", null, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // lists containing nulls at the end","lastModifiedDate":"2017-01-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(\"spam\", new Object(), null));","lastModifiedDate":"2017-05-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown(Arrays.asList(new Object(), null));","lastModifiedDate":"2017-05-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null reference","lastModifiedDate":"2017-05-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertNullPointerExceptionThrown((Collection\u003cObject\u003e) null);","lastModifiedDate":"2017-05-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // empty list","lastModifiedDate":"2017-01-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Collections.emptyList());","lastModifiedDate":"2017-05-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // list with all non-null elements","lastModifiedDate":"2017-01-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(new Object(), \"ham\", Integer.valueOf(1)));","lastModifiedDate":"2018-04-01"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // confirms nulls inside nested lists are not considered","lastModifiedDate":"2017-01-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" List\u003cObject\u003e containingNull \u003d Arrays.asList((Object) null);","lastModifiedDate":"2017-01-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertNullPointerExceptionNotThrown(Arrays.asList(containingNull, new Object()));","lastModifiedDate":"2017-05-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-22"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public void isAnyNonNull() {","lastModifiedDate":"2017-06-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull());","lastModifiedDate":"2017-06-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull((Object) null));","lastModifiedDate":"2017-06-21"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(CollectionUtil.isAnyNonNull((Object[]) null));","lastModifiedDate":"2017-06-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertTrue(CollectionUtil.isAnyNonNull(new Object()));","lastModifiedDate":"2017-06-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertTrue(CollectionUtil.isAnyNonNull(new Object(), null));","lastModifiedDate":"2017-06-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Asserts that {@code CollectionUtil#requireAllNonNull(Object...)} throw {@code NullPointerException}","lastModifiedDate":"2017-08-20"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * if {@code objects} or any element of {@code objects} is null.","lastModifiedDate":"2017-08-20"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionThrown(Object... objects) {","lastModifiedDate":"2017-05-19"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e CollectionUtil.requireAllNonNull(objects));","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Asserts that {@code CollectionUtil#requireAllNonNull(Collection\u003c?\u003e)} throw {@code NullPointerException}","lastModifiedDate":"2017-08-20"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * if {@code collection} or any element of {@code collection} is null.","lastModifiedDate":"2017-08-20"},{"lineNumber":98,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":99,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionThrown(Collection\u003c?\u003e collection) {","lastModifiedDate":"2017-05-19"},{"lineNumber":100,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e CollectionUtil.requireAllNonNull(collection));","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionNotThrown(Object... objects) {","lastModifiedDate":"2017-05-19"},{"lineNumber":104,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(objects);","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":107,"author":{"gitId":"-"},"content":" private void assertNullPointerExceptionNotThrown(Collection\u003c?\u003e collection) {","lastModifiedDate":"2017-05-19"},{"lineNumber":108,"author":{"gitId":"Wyrkx"},"content":" CollectionUtil.requireAllNonNull(collection);","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":110,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-22"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":6,"-":102}},{"path":"src/test/java/tutorpro/commons/util/ConfigUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-09-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-09-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2016-09-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.Config;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ConfigUtilTest {","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"ConfigUtilTest\");","lastModifiedDate":"2018-04-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Path tempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void read_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e read(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void read_missingFile_emptyResult() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(read(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void read_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e read(\"NotJsonFormatConfig.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void read_fileInOrder_successfullyRead() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Config expected \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"TypicalConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void read_valuesMissingFromFile_defaultValuesUsed() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"EmptyConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertEquals(new Config(), actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void read_extraValuesInFile_extraValuesIgnored() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Config expected \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Config actual \u003d read(\"ExtraValuesConfig.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private Config getTypicalConfig() {","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" Config config \u003d new Config();","lastModifiedDate":"2016-09-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" config.setLogLevel(Level.INFO);","lastModifiedDate":"2016-09-25"},{"lineNumber":68,"author":{"gitId":"-"},"content":" config.setUserPrefsFilePath(Paths.get(\"preferences.json\"));","lastModifiedDate":"2018-04-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return config;","lastModifiedDate":"2016-09-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private Optional\u003cConfig\u003e read(String configFileInTestDataFolder) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Path configFilePath \u003d addToTestDataPathIfNotNull(configFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return ConfigUtil.readConfig(configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void save_nullConfig_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e save(null, \"SomeFile.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void save_nullFile_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e save(new Config(), null));","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void saveConfig_allInOrder_success() throws DataLoadingException, IOException {","lastModifiedDate":"2023-06-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Config original \u003d getTypicalConfig();","lastModifiedDate":"2016-09-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":91,"author":{"gitId":"-"},"content":" Path configFilePath \u003d tempDir.resolve(\"TempConfig.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" //Try writing when the file doesn\u0027t exist","lastModifiedDate":"2016-09-24"},{"lineNumber":94,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(original, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Config readBack \u003d ConfigUtil.readConfig(configFilePath).get();","lastModifiedDate":"2016-12-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" //Try saving when the file exists","lastModifiedDate":"2016-09-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":" original.setLogLevel(Level.FINE);","lastModifiedDate":"2016-09-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(original, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":101,"author":{"gitId":"-"},"content":" readBack \u003d ConfigUtil.readConfig(configFilePath).get();","lastModifiedDate":"2016-12-20"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" private void save(Config config, String configFileInTestDataFolder) throws IOException {","lastModifiedDate":"2016-09-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Path configFilePath \u003d addToTestDataPathIfNotNull(configFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":107,"author":{"gitId":"-"},"content":" ConfigUtil.saveConfig(config, configFilePath);","lastModifiedDate":"2016-12-20"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String configFileInTestDataFolder) {","lastModifiedDate":"2018-04-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return configFileInTestDataFolder !\u003d null","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(configFileInTestDataFolder)","lastModifiedDate":"2018-04-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2016-09-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":8,"-":108}},{"path":"src/test/java/tutorpro/commons/util/FileUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class FileUtilTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public void isValidPath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":" // valid path","lastModifiedDate":"2018-04-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" assertTrue(FileUtil.isValidPath(\"valid/file/path\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // invalid path","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" assertFalse(FileUtil.isValidPath(\"a\\0\"));","lastModifiedDate":"2018-04-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":" // null path -\u003e throws NullPointerException","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e FileUtil.isValidPath(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":3,"-":21}},{"path":"src/test/java/tutorpro/commons/util/JsonUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2016-10-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.SerializableTestClass;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TestUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Tests JSON Read and Write","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class JsonUtilTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final Path SERIALIZATION_FILE \u003d TestUtil.getFilePathInSandboxFolder(\"serialize.json\");","lastModifiedDate":"2018-04-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void serializeObjectToJsonFile_noExceptionThrown() throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":" SerializableTestClass serializableTestClass \u003d new SerializableTestClass();","lastModifiedDate":"2016-10-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":" serializableTestClass.setTestValues();","lastModifiedDate":"2016-10-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":" JsonUtil.serializeObjectToJsonFile(SERIALIZATION_FILE, serializableTestClass);","lastModifiedDate":"2016-10-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(FileUtil.readFromFile(SERIALIZATION_FILE), SerializableTestClass.JSON_STRING_REPRESENTATION);","lastModifiedDate":"2016-10-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void deserializeObjectFromJsonFile_noExceptionThrown() throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(SERIALIZATION_FILE, SerializableTestClass.JSON_STRING_REPRESENTATION);","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" SerializableTestClass serializableTestClass \u003d JsonUtil","lastModifiedDate":"2016-10-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .deserializeObjectFromJsonFile(SERIALIZATION_FILE, SerializableTestClass.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getName(), SerializableTestClass.getNameTestValue());","lastModifiedDate":"2016-10-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getListOfLocalDateTimes(), SerializableTestClass.getListTestValues());","lastModifiedDate":"2016-10-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(serializableTestClass.getMapOfIntegerToString(), SerializableTestClass.getHashMapTestValues());","lastModifiedDate":"2016-10-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":" //TODO: @Test jsonUtil_readJsonStringToObjectInstance_correctObject()","lastModifiedDate":"2016-09-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":" //TODO: @Test jsonUtil_writeThenReadObjectToJson_correctObject()","lastModifiedDate":"2016-09-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":3,"-":42}},{"path":"src/test/java/tutorpro/commons/util/StringUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.commons.util;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class StringUtilTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":" //---------------- Tests for isNonZeroUnsignedInteger --------------------------------------","lastModifiedDate":"2019-02-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void isNonZeroUnsignedInteger() {","lastModifiedDate":"2019-02-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // EP: empty strings","lastModifiedDate":"2016-10-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"\")); // Boundary value","lastModifiedDate":"2017-06-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\" \"));","lastModifiedDate":"2017-06-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // EP: not a number","lastModifiedDate":"2016-10-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"a\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"aaa\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // EP: zero","lastModifiedDate":"2016-10-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"0\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // EP: zero as prefix","lastModifiedDate":"2017-06-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"01\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // EP: signed numbers","lastModifiedDate":"2016-10-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"-1\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"+1\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // EP: numbers with white space","lastModifiedDate":"2016-10-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\" 10 \")); // Leading/trailing spaces","lastModifiedDate":"2017-06-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(\"1 0\")); // Spaces in the middle","lastModifiedDate":"2017-06-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // EP: number larger than Integer.MAX_VALUE","lastModifiedDate":"2017-06-02"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.isNonZeroUnsignedInteger(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2017-06-02"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // EP: valid numbers, should return true","lastModifiedDate":"2016-10-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"1\")); // Boundary value","lastModifiedDate":"2017-06-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.isNonZeroUnsignedInteger(\"10\"));","lastModifiedDate":"2017-06-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" //---------------- Tests for containsWordIgnoreCase --------------------------------------","lastModifiedDate":"2016-10-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Invalid equivalence partitions for word: null, empty, multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Invalid equivalence partitions for sentence: null","lastModifiedDate":"2016-10-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * The four test cases below test one invalid input at a time.","lastModifiedDate":"2016-10-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_nullWord_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":61,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e StringUtil","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"agreatdayy"},"content":" .containsWordIgnoreCase(\"typical sentence\", null));","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_emptyWord_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, \"Word parameter cannot be empty\", ()","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"-"},"content":" -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", \" \"));","lastModifiedDate":"2019-03-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_multipleWords_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, \"Word parameter should be a single word\", ()","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"-"},"content":" -\u003e StringUtil.containsWordIgnoreCase(\"typical sentence\", \"aaa BBB\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_nullSentence_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":79,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e StringUtil","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"agreatdayy"},"content":" .containsWordIgnoreCase(null, \"abc\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Valid equivalence partitions for word:","lastModifiedDate":"2016-10-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * - any word","lastModifiedDate":"2016-10-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * - word containing symbols/numbers","lastModifiedDate":"2016-10-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * - word with leading/trailing spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Valid equivalence partitions for sentence:","lastModifiedDate":"2016-10-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * - empty string","lastModifiedDate":"2016-10-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * - one word","lastModifiedDate":"2016-10-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * - multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - sentence with extra spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Possible scenarios returning true:","lastModifiedDate":"2016-10-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * - matches first word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * - last word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * - middle word in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * - matches multiple words","lastModifiedDate":"2016-10-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * Possible scenarios returning false:","lastModifiedDate":"2016-10-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * - query word matches part of a sentence word","lastModifiedDate":"2016-10-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * - sentence word matches part of the query word","lastModifiedDate":"2016-10-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-10-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * The test method below tries to verify all above with a reasonably low number of test cases.","lastModifiedDate":"2016-10-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void containsWordIgnoreCase_validInputs_correctResult() {","lastModifiedDate":"2016-10-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Empty sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"\", \"abc\")); // Boundary case","lastModifiedDate":"2016-10-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\" \", \"123\"));","lastModifiedDate":"2016-10-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // Matches a partial word only","lastModifiedDate":"2016-10-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \"bb\")); // Sentence word bigger than query word","lastModifiedDate":"2016-10-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertFalse(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \"bbbb\")); // Query word bigger than sentence word","lastModifiedDate":"2016-10-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // Matches word in the sentence, different upper/lower case letters","lastModifiedDate":"2016-10-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bBb ccc\", \"Bbb\")); // First word (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bBb ccc@1\", \"CCc@1\")); // Last word (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\" AAA bBb ccc \", \"aaa\")); // Sentence has extra spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"Aaa\", \"aaa\")); // Only one word in sentence (boundary case)","lastModifiedDate":"2016-10-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"aaa bbb ccc\", \" ccc \")); // Leading/trailing spaces","lastModifiedDate":"2016-10-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" // Matches multiple words in sentence","lastModifiedDate":"2016-10-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.containsWordIgnoreCase(\"AAA bBb ccc bbb\", \"bbB\"));","lastModifiedDate":"2016-10-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" //---------------- Tests for getDetails --------------------------------------","lastModifiedDate":"2016-10-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Equivalence Partitions: null, valid throwable object","lastModifiedDate":"2016-10-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-13"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void getDetails_exceptionGiven() {","lastModifiedDate":"2016-09-30"},{"lineNumber":138,"author":{"gitId":"-"},"content":" assertTrue(StringUtil.getDetails(new FileNotFoundException(\"file not found\"))","lastModifiedDate":"2019-03-14"},{"lineNumber":139,"author":{"gitId":"-"},"content":" .contains(\"java.io.FileNotFoundException: file not found\"));","lastModifiedDate":"2019-03-14"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":142,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" public void getDetails_nullGiven_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":144,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e StringUtil.getDetails(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"agreatdayy":5,"Wyrkx":5,"-":137}},{"path":"src/test/java/tutorpro/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.TypicalPersons.AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.CommandResult;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ListCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonAddressBookStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.JsonUserPrefsStorage;","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.storage.StorageManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":50,"author":{"gitId":"agreatdayy"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"agreatdayy"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":123,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":125,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":138,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":149,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":150,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":160,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":166,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY;","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":176,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":23,"-":151}},{"path":"src/test/java/tutorpro/logic/commands/AddCommandIntegrationTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code AddCommand}.","lastModifiedDate":"2017-06-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AddCommandIntegrationTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-15"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void execute_newPerson_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" expectedModel.addPerson(validPerson);","lastModifiedDate":"2017-06-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new AddCommand(validPerson), model,","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" expectedModel);","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(0);","lastModifiedDate":"2018-01-10"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(new AddCommand(personInList), model,","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AddCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":11,"-":35}},{"path":"src/test/java/tutorpro/logic/commands/AddCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-01-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-05-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyUserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class AddCommandTest {","lastModifiedDate":"2017-05-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new AddCommand(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2017-05-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2017-05-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new AddCommand(validPerson).execute(modelStub);","lastModifiedDate":"2019-01-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(String.format(AddCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2017-05-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" AddCommand addCommand \u003d new AddCommand(validPerson);","lastModifiedDate":"2018-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":54,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(CommandException.class,","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"agreatdayy"},"content":" AddCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-22"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Person alice \u003d new PersonBuilder().withName(\"Alice\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":61,"author":{"gitId":"-"},"content":" Person bob \u003d new PersonBuilder().withName(\"Bob\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":62,"author":{"gitId":"-"},"content":" AddCommand addAliceCommand \u003d new AddCommand(alice);","lastModifiedDate":"2017-06-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":" AddCommand addBobCommand \u003d new AddCommand(bob);","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" AddCommand addAliceCommandCopy \u003d new AddCommand(alice);","lastModifiedDate":"2017-06-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2017-06-22"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2017-06-22"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":78,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" AddCommand addCommand \u003d new AddCommand(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":" String expected \u003d AddCommand.class.getCanonicalName() + \"{toAdd\u003d\" + TypicalPersons.ALICE + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2017-05-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2017-05-12"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":95,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":105,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":125,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2018-11-27"},{"lineNumber":130,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-12"},{"lineNumber":135,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":143,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":144,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-08"},{"lineNumber":145,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":148,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":149,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":150,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":153,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":155,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":158,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":159,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":160,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":164,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":165,"author":{"gitId":"-"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2018-08-07"},{"lineNumber":166,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":167,"author":{"gitId":"-"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2018-08-07"},{"lineNumber":168,"author":{"gitId":"-"},"content":" private final Person person;","lastModifiedDate":"2018-08-07"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":170,"author":{"gitId":"-"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":171,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":172,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2018-08-07"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":176,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":178,"author":{"gitId":"-"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":183,"author":{"gitId":"-"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2017-05-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":185,"author":{"gitId":"-"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2017-05-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2017-05-12"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":190,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":194,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":195,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-08"},{"lineNumber":196,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":197,"author":{"gitId":"-"},"content":" personsAdded.add(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":" return new AddressBook();","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":206,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-12"}],"authorContributionMap":{"agreatdayy":4,"Wyrkx":14,"-":188}},{"path":"src/test/java/tutorpro/logic/commands/ClearCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"public class ClearCommandTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" public void execute_emptyAddressBook_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" Model model \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" public void execute_nonEmptyAddressBook_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" Model expectedModel \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" expectedModel.setAddressBook(new AddressBook());","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new ClearCommand(), model, ClearCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":31}},{"path":"src/test/java/tutorpro/logic/commands/CommandResultTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class CommandResultTest {","lastModifiedDate":"2018-12-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(new CommandResult(\"feedback\")));","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(new CommandResult(\"feedback\", false, false)));","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" assertTrue(commandResult.equals(commandResult));","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(null));","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(0.5f));","lastModifiedDate":"2018-12-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // different feedbackToUser value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"different\")));","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // different showHelp value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"feedback\", true, false)));","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" // different exit value -\u003e returns false","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(commandResult.equals(new CommandResult(\"feedback\", false, true)));","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void hashcode() {","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // same values -\u003e returns same hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(commandResult.hashCode(), new CommandResult(\"feedback\").hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // different feedbackToUser value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"different\").hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // different showHelp value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"feedback\", true, false).hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different exit value -\u003e returns different hashcode","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertNotEquals(commandResult.hashCode(), new CommandResult(\"feedback\", false, true).hashCode());","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d new CommandResult(\"feedback\");","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String expected \u003d CommandResult.class.getCanonicalName() + \"{feedbackToUser\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" + commandResult.getFeedbackToUser() + \", showHelp\u003d\" + commandResult.isShowHelp()","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" + \", exit\u003d\" + commandResult.isExit() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertEquals(expected, commandResult.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-12-09"}],"authorContributionMap":{"Wyrkx":1,"-":62}},{"path":"src/test/java/tutorpro/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.exceptions.CommandException;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.parser.CliSyntax;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_NAME_DESC \u003d \" \" + CliSyntax.PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \" + CliSyntax.PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + CliSyntax.PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"agreatdayy"},"content":" // Invalid address: empty string not allowed for addresses","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"agreatdayy"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" public static final String INVALID_TAG_DESC \u003d \" \" + CliSyntax.PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":77,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":83,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":92,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":93,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":94,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":102,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":104,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":109,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":122,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":127,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"agreatdayy":6,"Wyrkx":24,"-":97}},{"path":"src/test/java/tutorpro/logic/commands/DeleteCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for","lastModifiedDate":"2020-12-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * {@code DeleteCommand}.","lastModifiedDate":"2018-01-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class DeleteCommandTest {","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void execute_validIndexUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2019-02-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void execute_invalidIndexUnfilteredList_throwsCommandException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-06-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(outOfBoundIndex);","lastModifiedDate":"2018-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void execute_validIndexFilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" showNoPerson(expectedModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void execute_invalidIndexFilteredList_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":" Index outOfBoundIndex \u003d TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-06-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(outOfBoundIndex);","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":76,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteFirstCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteSecondCommand \u003d new DeleteCommand(TypicalIndexes.INDEX_SECOND_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand deleteFirstCommandCopy \u003d new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(deleteSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Index targetIndex \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" DeleteCommand deleteCommand \u003d new DeleteCommand(targetIndex);","lastModifiedDate":"2019-02-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String expected \u003d DeleteCommand.class.getCanonicalName() + \"{targetIndex\u003d\" + targetIndex + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertEquals(expected, deleteCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show no one.","lastModifiedDate":"2017-06-05"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" private void showNoPerson(Model model) {","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(p -\u003e false);","lastModifiedDate":"2017-06-12"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertTrue(model.getFilteredPersonList().isEmpty());","lastModifiedDate":"2018-02-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":117,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":24,"-":92}},{"path":"src/test/java/tutorpro/logic/commands/EditCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for EditCommand.","lastModifiedDate":"2020-12-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class EditCommandTest {","lastModifiedDate":"2017-05-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_allFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-26"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(editedPerson).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void execute_someFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Index indexLastPerson \u003d Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Person lastPerson \u003d model.getFilteredPersonList().get(indexLastPerson.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":48,"author":{"gitId":"-"},"content":" PersonBuilder personInList \u003d new PersonBuilder(lastPerson);","lastModifiedDate":"2017-05-18"},{"lineNumber":49,"author":{"gitId":"agreatdayy"},"content":" Person editedPerson \u003d personInList.withName(CommandTestUtil.VALID_NAME_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).withTags(CommandTestUtil.VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder()","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"agreatdayy"},"content":" .withName(CommandTestUtil.VALID_NAME_BOB).withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"agreatdayy"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(indexLastPerson, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":" expectedModel.setPerson(lastPerson, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void execute_noFieldSpecifiedUnfilteredList_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":67,"author":{"gitId":"agreatdayy"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"agreatdayy"},"content":" new EditCommand.EditPersonDescriptor());","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":" Person editedPerson \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":71,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public void execute_filteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":82,"author":{"gitId":"agreatdayy"},"content":" Person personInFilteredList \u003d model.getFilteredPersonList()","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"agreatdayy"},"content":" .get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" Person editedPerson \u003d new PersonBuilder(personInFilteredList).withName(CommandTestUtil.VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"Wyrkx"},"content":" new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_BOB).build());","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" Person firstPerson \u003d model.getFilteredPersonList().get(TypicalIndexes.INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(firstPerson).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_SECOND_PERSON, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":102,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":109,"author":{"gitId":"-"},"content":" // edit person in filtered list into a duplicate in address book","lastModifiedDate":"2017-05-18"},{"lineNumber":110,"author":{"gitId":"agreatdayy"},"content":" Person personInList \u003d model.getAddressBook().getPersonList()","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"agreatdayy"},"content":" .get(TypicalIndexes.INDEX_SECOND_PERSON.getZeroBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"Wyrkx"},"content":" EditCommand editCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder(personInList).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":115,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-05-18"},{"lineNumber":121,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder()","lastModifiedDate":"2024-03-11"},{"lineNumber":122,"author":{"gitId":"agreatdayy"},"content":" .withName(CommandTestUtil.VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":123,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":125,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-18"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Edit filtered list where index is larger than size of filtered list,","lastModifiedDate":"2017-05-18"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * but smaller than size of address book","lastModifiedDate":"2017-05-18"},{"lineNumber":131,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-18"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":134,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":135,"author":{"gitId":"Wyrkx"},"content":" Index outOfBoundIndex \u003d TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":136,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-05-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":139,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex,","lastModifiedDate":"2018-08-08"},{"lineNumber":140,"author":{"gitId":"Wyrkx"},"content":" new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_BOB).build());","lastModifiedDate":"2024-03-11"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":142,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":143,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":147,"author":{"gitId":"agreatdayy"},"content":" final EditCommand standardCommand \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":148,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.DESC_AMY);","lastModifiedDate":"2024-03-11"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":150,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":151,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor copyDescriptor \u003d new EditCommand","lastModifiedDate":"2024-03-11"},{"lineNumber":152,"author":{"gitId":"agreatdayy"},"content":" .EditPersonDescriptor(CommandTestUtil.DESC_AMY);","lastModifiedDate":"2024-03-11"},{"lineNumber":153,"author":{"gitId":"Wyrkx"},"content":" EditCommand commandWithSameValues \u003d new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, copyDescriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":154,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(commandWithSameValues));","lastModifiedDate":"2017-05-08"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(standardCommand));","lastModifiedDate":"2017-05-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(null));","lastModifiedDate":"2017-05-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new ClearCommand()));","lastModifiedDate":"2017-05-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":166,"author":{"gitId":"agreatdayy"},"content":" assertFalse(standardCommand.equals(new EditCommand(TypicalIndexes.INDEX_SECOND_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":167,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.DESC_AMY)));","lastModifiedDate":"2024-03-11"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":" // different descriptor -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":170,"author":{"gitId":"agreatdayy"},"content":" assertFalse(standardCommand.equals(new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":171,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.DESC_BOB)));","lastModifiedDate":"2024-03-11"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":177,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor editPersonDescriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":178,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2019-02-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" String expected \u003d EditCommand.class.getCanonicalName() + \"{index\u003d\" + index + \", editPersonDescriptor\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" + editPersonDescriptor + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertEquals(expected, editCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-08"}],"authorContributionMap":{"agreatdayy":22,"Wyrkx":39,"-":123}},{"path":"src/test/java/tutorpro/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" public void equals() {","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor descriptorWithSameValues \u003d new EditCommand","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"agreatdayy"},"content":" .EditPersonDescriptor(CommandTestUtil.DESC_AMY);","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(CommandTestUtil.DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(CommandTestUtil.DESC_AMY.equals(CommandTestUtil.DESC_AMY));","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(5));","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(CommandTestUtil.DESC_BOB));","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" // different name -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"agreatdayy"},"content":" .withName(CommandTestUtil.VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"agreatdayy"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"agreatdayy"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" // different email -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"agreatdayy"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"agreatdayy"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" // different address -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"agreatdayy"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"agreatdayy"},"content":" .withAddress(CommandTestUtil.VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"agreatdayy"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(CommandTestUtil.DESC_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"agreatdayy"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(CommandTestUtil.DESC_AMY.equals(editedAmy));","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor editPersonDescriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" String expected \u003d EditCommand.EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getName().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":14,"Wyrkx":56}},{"path":"src/test/java/tutorpro/logic/commands/ExitCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"public class ExitCommandTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" private Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" public void execute_exit_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"agreatdayy"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(ExitCommand.MESSAGE_EXIT_ACKNOWLEDGEMENT,","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":" false, true);","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" CommandTestUtil.assertCommandSuccess(new ExitCommand(), model, expectedCommandResult, expectedModel);","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":17}},{"path":"src/test/java/tutorpro/logic/commands/FindCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code FindCommand}.","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class FindCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" private Model model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" private Model expectedModel \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"first\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"second\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" FindCommand findFirstCommand \u003d new FindCommand(firstPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" FindCommand findSecondCommand \u003d new FindCommand(secondPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" FindCommand findFirstCommandCopy \u003d new FindCommand(firstPredicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(findSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void execute_zeroKeywords_noPersonFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, 0);","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\" \");","lastModifiedDate":"2018-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" FindCommand command \u003d new FindCommand(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void execute_multipleKeywords_multiplePersonsFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, 3);","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\"Kurz Elle Kunz\");","lastModifiedDate":"2018-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" FindCommand command \u003d new FindCommand(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":71,"author":{"gitId":"agreatdayy"},"content":" assertEquals(Arrays.asList(TypicalPersons.CARL, TypicalPersons.ELLE, TypicalPersons.FIONA),","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"agreatdayy"},"content":" model.getFilteredPersonList());","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"keyword\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" FindCommand findCommand \u003d new FindCommand(predicate);","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String expected \u003d FindCommand.class.getCanonicalName() + \"{predicate\u003d\" + predicate + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertEquals(expected, findCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-12"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}.","lastModifiedDate":"2018-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":" private NameContainsKeywordsPredicate preparePredicate(String userInput) {","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return new NameContainsKeywordsPredicate(Arrays.asList(userInput.split(\"\\\\s+\")));","lastModifiedDate":"2018-08-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":89,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":11,"-":75}},{"path":"src/test/java/tutorpro/logic/commands/HelpCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class HelpCommandTest {","lastModifiedDate":"2017-06-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private Model expectedModel \u003d new ModelManager();","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public void execute_help_success() {","lastModifiedDate":"2017-06-08"},{"lineNumber":16,"author":{"gitId":"agreatdayy"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(HelpCommand.SHOWING_HELP_MESSAGE,","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":" true, false);","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" assertCommandSuccess(new HelpCommand(), model, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-08"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":4,"-":14}},{"path":"src/test/java/tutorpro/logic/commands/ListCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.commands;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ModelManager;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for ListCommand.","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class ListCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private Model expectedModel;","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" model \u003d new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_listIsNotFiltered_showsSameList() {","lastModifiedDate":"2017-08-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ListCommand(), model, ListCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void execute_listIsFiltered_showsEverything() {","lastModifiedDate":"2017-08-15"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" showPersonAtIndex(model, TypicalIndexes.INDEX_FIRST_PERSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertCommandSuccess(new ListCommand(), model, ListCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"Wyrkx":10,"-":29}},{"path":"src/test/java/tutorpro/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":" Person expectedPerson \u003d new PersonBuilder(TypicalPersons.BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":" .withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" // whitespace only preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseSuccess(parser, CommandTestUtil.PREAMBLE_WHITESPACE","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" // multiple tags - all accepted","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"agreatdayy"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(TypicalPersons.BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"agreatdayy"},"content":" .withTags(CommandTestUtil.VALID_TAG_FRIEND, CommandTestUtil.VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"agreatdayy"},"content":" String validExpectedPersonString \u003d CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" // multiple names","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" // multiple phones","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" // multiple emails","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":" // multiple addresses","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" // multiple fields repeated","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"agreatdayy"},"content":" validExpectedPersonString + CommandTestUtil.PHONE_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"agreatdayy"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME, CliSyntax.PREFIX_ADDRESS,","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"agreatdayy"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" // invalid value followed by valid value","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":" // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":" // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"Wyrkx"},"content":" // valid value followed by invalid value","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"Wyrkx"},"content":" // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"agreatdayy"},"content":" validExpectedPersonString + CommandTestUtil.INVALID_NAME_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"Wyrkx"},"content":" // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"agreatdayy"},"content":" validExpectedPersonString + CommandTestUtil.INVALID_EMAIL_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"agreatdayy"},"content":" validExpectedPersonString + CommandTestUtil.INVALID_PHONE_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"Wyrkx"},"content":" // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"agreatdayy"},"content":" validExpectedPersonString + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"Wyrkx"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"Wyrkx"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"Wyrkx"},"content":" // zero tags","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"Wyrkx"},"content":" Person expectedPerson \u003d new PersonBuilder(TypicalPersons.AMY).withTags().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":122,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseSuccess(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":123,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":124,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-03-11"},{"lineNumber":125,"author":{"gitId":"Wyrkx"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":127,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":128,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":129,"author":{"gitId":"Wyrkx"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":130,"author":{"gitId":"Wyrkx"},"content":" String expectedMessage \u003d String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-03-11"},{"lineNumber":131,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":132,"author":{"gitId":"Wyrkx"},"content":" // missing name prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":133,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":134,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.VALID_NAME_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":135,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":136,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":137,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":138,"author":{"gitId":"Wyrkx"},"content":" // missing phone prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":139,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":140,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.VALID_PHONE_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":141,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":142,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":143,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":144,"author":{"gitId":"Wyrkx"},"content":" // missing email prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":145,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":146,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":147,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.VALID_EMAIL_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":148,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":149,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":150,"author":{"gitId":"Wyrkx"},"content":" // missing address prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":151,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":152,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":153,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":154,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":155,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":156,"author":{"gitId":"Wyrkx"},"content":" // all prefixes missing","lastModifiedDate":"2024-03-11"},{"lineNumber":157,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":158,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.VALID_NAME_BOB + CommandTestUtil.VALID_PHONE_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":159,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.VALID_EMAIL_BOB + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"Wyrkx"},"content":" expectedMessage);","lastModifiedDate":"2024-03-11"},{"lineNumber":161,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":162,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":164,"author":{"gitId":"Wyrkx"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":165,"author":{"gitId":"Wyrkx"},"content":" // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":166,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":167,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":168,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":169,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":170,"author":{"gitId":"agreatdayy"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":171,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":172,"author":{"gitId":"Wyrkx"},"content":" // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":173,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":174,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":175,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":176,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":177,"author":{"gitId":"agreatdayy"},"content":" Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":178,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":179,"author":{"gitId":"Wyrkx"},"content":" // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":180,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":181,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":182,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":183,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":184,"author":{"gitId":"agreatdayy"},"content":" Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":185,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":186,"author":{"gitId":"Wyrkx"},"content":" // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":187,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":188,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":189,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":190,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":191,"author":{"gitId":"agreatdayy"},"content":" Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":192,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":193,"author":{"gitId":"Wyrkx"},"content":" // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":194,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":195,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":196,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":197,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.INVALID_TAG_DESC + CommandTestUtil.VALID_TAG_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":198,"author":{"gitId":"agreatdayy"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":199,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":200,"author":{"gitId":"Wyrkx"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2024-03-11"},{"lineNumber":201,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":202,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":203,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":204,"author":{"gitId":"Wyrkx"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":205,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":206,"author":{"gitId":"Wyrkx"},"content":" // non-empty preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":207,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":208,"author":{"gitId":"agreatdayy"},"content":" CommandTestUtil.PREAMBLE_NON_EMPTY + CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":209,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":210,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-11"},{"lineNumber":211,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":212,"author":{"gitId":"Wyrkx"},"content":" String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-11"},{"lineNumber":213,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":214,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":91,"Wyrkx":123}},{"path":"src/test/java/tutorpro/logic/parser/AddressBookParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-06-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ClearCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ExitCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.HelpCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.ListCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"public class AddressBookParserTest {","lastModifiedDate":"2017-07-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private final AddressBookParser parser \u003d new AddressBookParser();","lastModifiedDate":"2017-07-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void parseCommand_add() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" AddCommand command \u003d (AddCommand) parser.parseCommand(PersonUtil.getAddCommand(person));","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(new AddCommand(person), command);","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void parseCommand_clear() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD) instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD + \" 3\") instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void parseCommand_delete() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" DeleteCommand command \u003d (DeleteCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" DeleteCommand.COMMAND_WORD + \" \" + TypicalIndexes.INDEX_FIRST_PERSON.getOneBased());","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" assertEquals(new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON), command);","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void parseCommand_edit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(person).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":" EditCommand command \u003d (EditCommand) parser.parseCommand(EditCommand.COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-27"},{"lineNumber":60,"author":{"gitId":"agreatdayy"},"content":" + TypicalIndexes.INDEX_FIRST_PERSON.getOneBased() + \" \"","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"agreatdayy"},"content":" + PersonUtil.getEditPersonDescriptorDetails(descriptor));","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" assertEquals(new EditCommand(TypicalIndexes.INDEX_FIRST_PERSON, descriptor), command);","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void parseCommand_exit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD) instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD + \" 3\") instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void parseCommand_find() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d Arrays.asList(\"foo\", \"bar\", \"baz\");","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":" FindCommand command \u003d (FindCommand) parser.parseCommand(","lastModifiedDate":"2017-06-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" FindCommand.COMMAND_WORD + \" \" + keywords.stream().collect(Collectors.joining(\" \")));","lastModifiedDate":"2017-06-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertEquals(new FindCommand(new NameContainsKeywordsPredicate(keywords)), command);","lastModifiedDate":"2017-06-12"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parseCommand_help() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD) instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD + \" 3\") instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void parseCommand_list() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD) instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ListCommand.COMMAND_WORD + \" 3\") instanceof ListCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void parseCommand_unrecognisedInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":93,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(ParseException.class, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"agreatdayy"},"content":" HelpCommand.MESSAGE_USAGE), () -\u003e parser.parseCommand(\"\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public void parseCommand_unknownCommand_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":99,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(ParseException.class,","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"agreatdayy"},"content":" Messages.MESSAGE_UNKNOWN_COMMAND, () -\u003e parser.parseCommand(\"unknownCommand\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"agreatdayy":9,"Wyrkx":20,"-":73}},{"path":"src/test/java/tutorpro/logic/parser/ArgumentTokenizerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class ArgumentTokenizerTest {","lastModifiedDate":"2016-10-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private final Prefix unknownPrefix \u003d new Prefix(\"--u\");","lastModifiedDate":"2016-10-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final Prefix pSlash \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-03-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final Prefix dashT \u003d new Prefix(\"-t\");","lastModifiedDate":"2016-10-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private final Prefix hatQ \u003d new Prefix(\"^Q\");","lastModifiedDate":"2016-10-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void tokenize_emptyArgsString_noValues() {","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String argsString \u003d \" \";","lastModifiedDate":"2016-10-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private void assertPreamblePresent(ArgumentMultimap argMultimap, String expectedPreamble) {","lastModifiedDate":"2017-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(expectedPreamble, argMultimap.getPreamble());","lastModifiedDate":"2017-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private void assertPreambleEmpty(ArgumentMultimap argMultimap) {","lastModifiedDate":"2017-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertTrue(argMultimap.getPreamble().isEmpty());","lastModifiedDate":"2017-03-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Asserts all the arguments in {@code argMultimap} with {@code prefix} match the {@code expectedValues}","lastModifiedDate":"2017-08-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * and only the last value is returned upon calling {@code ArgumentMultimap#getValue(Prefix)}.","lastModifiedDate":"2017-08-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private void assertArgumentPresent(ArgumentMultimap argMultimap, Prefix prefix, String... expectedValues) {","lastModifiedDate":"2017-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // Verify the last value is returned","lastModifiedDate":"2016-10-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[expectedValues.length - 1], argMultimap.getValue(prefix).get());","lastModifiedDate":"2017-06-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // Verify the number of values returned is as expected","lastModifiedDate":"2016-10-16"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertEquals(expectedValues.length, argMultimap.getAllValues(prefix).size());","lastModifiedDate":"2017-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Verify all values returned are as expected and in order","lastModifiedDate":"2016-10-16"},{"lineNumber":47,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c expectedValues.length; i++) {","lastModifiedDate":"2016-10-16"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[i], argMultimap.getAllValues(prefix).get(i));","lastModifiedDate":"2017-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private void assertArgumentAbsent(ArgumentMultimap argMultimap, Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(argMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void tokenize_noPrefixes_allTakenAsPreamble() {","lastModifiedDate":"2016-10-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String argsString \u003d \" some random string /t tag with leading and trailing spaces \";","lastModifiedDate":"2016-10-16"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString);","lastModifiedDate":"2017-03-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":61,"author":{"gitId":"-"},"content":" // Same string expected as preamble, but leading/trailing spaces should be trimmed","lastModifiedDate":"2016-10-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString.trim());","lastModifiedDate":"2017-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void tokenize_oneArgument() {","lastModifiedDate":"2016-10-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Preamble present","lastModifiedDate":"2016-10-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String argsString \u003d \" Some preamble string p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Some preamble string\");","lastModifiedDate":"2017-03-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // No preamble","lastModifiedDate":"2016-10-16"},{"lineNumber":75,"author":{"gitId":"-"},"content":" argsString \u003d \" p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void tokenize_multipleArguments() {","lastModifiedDate":"2016-10-16"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // Only two arguments are present","lastModifiedDate":"2016-10-16"},{"lineNumber":85,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-03-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // All three arguments are present","lastModifiedDate":"2017-05-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" argsString \u003d \"Different Preamble String ^Q111 -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Different Preamble String\");","lastModifiedDate":"2017-03-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"111\");","lastModifiedDate":"2017-03-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /* Also covers: Reusing of the tokenizer multiple times */","lastModifiedDate":"2016-10-16"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // Reuse tokenizer on an empty string to ensure ArgumentMultimap is correctly reset","lastModifiedDate":"2017-03-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // (i.e. no stale values from the previous tokenizing remain)","lastModifiedDate":"2017-03-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" argsString \u003d \"\";","lastModifiedDate":"2017-03-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /* Also covers: testing for prefixes not specified as a prefix */","lastModifiedDate":"2020-05-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Prefixes not previously given to the tokenizer should not return any values","lastModifiedDate":"2016-10-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" argsString \u003d unknownPrefix + \"some value\";","lastModifiedDate":"2017-05-09"},{"lineNumber":113,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, unknownPrefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString); // Unknown prefix is taken as part of preamble","lastModifiedDate":"2017-03-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsWithRepeats() {","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // Two arguments repeated, some have empty values","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value ^Q ^Q -t another dashT value p/ pSlash value -t\";","lastModifiedDate":"2017-03-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\", \"another dashT value\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-19"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsJoined() {","lastModifiedDate":"2017-05-19"},{"lineNumber":131,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleStringp/ pSlash joined-tjoined -t not joined^Qjoined\";","lastModifiedDate":"2017-05-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleStringp/ pSlash joined-tjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-05-19"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"not joined^Qjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public void equalsMethod() {","lastModifiedDate":"2016-10-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Prefix aaa \u003d new Prefix(\"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":143,"author":{"gitId":"-"},"content":" assertEquals(aaa, aaa);","lastModifiedDate":"2016-10-16"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertEquals(aaa, new Prefix(\"aaa\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, \"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, new Prefix(\"aab\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":150,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-16"}],"authorContributionMap":{"Wyrkx":1,"-":149}},{"path":"src/test/java/tutorpro/logic/parser/CommandParserTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Contains helper methods for testing command parsers.","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class CommandParserTestUtil {","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is successful and the command created","lastModifiedDate":"2017-07-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * equals to {@code expectedCommand}.","lastModifiedDate":"2017-07-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static void assertParseSuccess(Parser\u003c? extends Command\u003e parser, String userInput,","lastModifiedDate":"2022-02-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" Command expectedCommand) {","lastModifiedDate":"2022-02-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" Command command \u003d parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertEquals(expectedCommand, command);","lastModifiedDate":"2017-07-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(\"Invalid userInput.\", pe);","lastModifiedDate":"2017-08-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is unsuccessful and the error message","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * equals to {@code expectedMessage}.","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static void assertParseFailure(Parser\u003c? extends Command\u003e parser, String userInput, String expectedMessage) {","lastModifiedDate":"2022-02-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-07-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" throw new AssertionError(\"The expected ParseException was not thrown.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-07-06"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(expectedMessage, pe.getMessage());","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":5,"-":35}},{"path":"src/test/java/tutorpro/logic/parser/DeleteCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.commands.DeleteCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * As we are only doing white-box testing, our test cases do not cover path variations","lastModifiedDate":"2017-06-09"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":" * outside the DeleteCommand code. For example, inputs \"1\" and \"1 abc\" take the","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * same path through the DeleteCommand, and therefore we test only one of them.","lastModifiedDate":"2017-06-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * The path variation for those two cases occur inside the ParserUtil, and","lastModifiedDate":"2017-06-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * therefore should be covered by the ParserUtilTest.","lastModifiedDate":"2017-06-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class DeleteCommandParserTest {","lastModifiedDate":"2017-06-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private DeleteCommandParser parser \u003d new DeleteCommandParser();","lastModifiedDate":"2017-06-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsDeleteCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseSuccess(parser, \"1\",","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":" new DeleteCommand(TypicalIndexes.INDEX_FIRST_PERSON));","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void parse_invalidArgs_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":28,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"a\",","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"agreatdayy"},"content":" String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"agreatdayy":6,"Wyrkx":3,"-":22}},{"path":"src/test/java/tutorpro/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalIndexes;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" private static final String TAG_EMPTY \u003d \" \" + CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" // no index specified","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, CommandTestUtil.VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" // no field specified","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" // no index and no field specified","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" // negative index","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"agreatdayy"},"content":" \"-5\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" // zero index","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"agreatdayy"},"content":" \"0\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.EMAIL_DESC_AMY,","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"agreatdayy"},"content":" Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"Wyrkx"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND + TAG_EMPTY,","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"agreatdayy"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.TAG_DESC_FRIEND + TAG_EMPTY + CommandTestUtil.TAG_DESC_HUSBAND,","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"agreatdayy"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"agreatdayy"},"content":" \"1\" + TAG_EMPTY + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND,","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"agreatdayy"},"content":" Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser,","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"agreatdayy"},"content":" \"1\" + CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.VALID_ADDRESS_AMY + CommandTestUtil.VALID_PHONE_AMY,","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"Wyrkx"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"agreatdayy"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder()","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"agreatdayy"},"content":" .withName(CommandTestUtil.VALID_NAME_AMY).withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"agreatdayy"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_AMY).withAddress(CommandTestUtil.VALID_ADDRESS_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"Wyrkx"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND, CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"Wyrkx"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder()","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"agreatdayy"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"Wyrkx"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":122,"author":{"gitId":"Wyrkx"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":123,"author":{"gitId":"Wyrkx"},"content":" // name","lastModifiedDate":"2024-03-11"},{"lineNumber":124,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":125,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"agreatdayy"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder()","lastModifiedDate":"2024-03-11"},{"lineNumber":127,"author":{"gitId":"agreatdayy"},"content":" .withName(CommandTestUtil.VALID_NAME_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":128,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":129,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":130,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":131,"author":{"gitId":"Wyrkx"},"content":" // phone","lastModifiedDate":"2024-03-11"},{"lineNumber":132,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":133,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(CommandTestUtil.VALID_PHONE_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":134,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":135,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":136,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":137,"author":{"gitId":"Wyrkx"},"content":" // email","lastModifiedDate":"2024-03-11"},{"lineNumber":138,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":139,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":140,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":141,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":142,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":143,"author":{"gitId":"Wyrkx"},"content":" // address","lastModifiedDate":"2024-03-11"},{"lineNumber":144,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":145,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(CommandTestUtil.VALID_ADDRESS_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":146,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":147,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":148,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":149,"author":{"gitId":"Wyrkx"},"content":" // tags","lastModifiedDate":"2024-03-11"},{"lineNumber":150,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":151,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":152,"author":{"gitId":"Wyrkx"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":153,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":154,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":155,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":156,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":157,"author":{"gitId":"Wyrkx"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":158,"author":{"gitId":"Wyrkx"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2024-03-11"},{"lineNumber":159,"author":{"gitId":"Wyrkx"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":161,"author":{"gitId":"Wyrkx"},"content":" // valid followed by invalid","lastModifiedDate":"2024-03-11"},{"lineNumber":162,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"agreatdayy"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":164,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":165,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":166,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput,","lastModifiedDate":"2024-03-11"},{"lineNumber":167,"author":{"gitId":"agreatdayy"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":168,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":169,"author":{"gitId":"Wyrkx"},"content":" // invalid followed by valid","lastModifiedDate":"2024-03-11"},{"lineNumber":170,"author":{"gitId":"Wyrkx"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":171,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":172,"author":{"gitId":"agreatdayy"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput,","lastModifiedDate":"2024-03-11"},{"lineNumber":173,"author":{"gitId":"agreatdayy"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":174,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":175,"author":{"gitId":"Wyrkx"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2024-03-11"},{"lineNumber":176,"author":{"gitId":"agreatdayy"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":177,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":178,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-11"},{"lineNumber":179,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":180,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":181,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":182,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput,","lastModifiedDate":"2024-03-11"},{"lineNumber":183,"author":{"gitId":"agreatdayy"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE, CliSyntax.PREFIX_EMAIL,","lastModifiedDate":"2024-03-11"},{"lineNumber":184,"author":{"gitId":"agreatdayy"},"content":" CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":185,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":186,"author":{"gitId":"Wyrkx"},"content":" // multiple invalid values","lastModifiedDate":"2024-03-11"},{"lineNumber":187,"author":{"gitId":"agreatdayy"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":188,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":189,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":190,"author":{"gitId":"agreatdayy"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":191,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":192,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseFailure(parser, userInput,","lastModifiedDate":"2024-03-11"},{"lineNumber":193,"author":{"gitId":"agreatdayy"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-03-11"},{"lineNumber":194,"author":{"gitId":"agreatdayy"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-11"},{"lineNumber":195,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":196,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":197,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":198,"author":{"gitId":"Wyrkx"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":199,"author":{"gitId":"Wyrkx"},"content":" Index targetIndex \u003d TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":200,"author":{"gitId":"Wyrkx"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2024-03-11"},{"lineNumber":201,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":202,"author":{"gitId":"Wyrkx"},"content":" EditCommand.EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":203,"author":{"gitId":"Wyrkx"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":204,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":205,"author":{"gitId":"Wyrkx"},"content":" CommandParserTestUtil.assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-11"},{"lineNumber":206,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":207,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":59,"Wyrkx":148}},{"path":"src/test/java/tutorpro/logic/parser/FindCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.Messages;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.FindCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParserTest {","lastModifiedDate":"2017-06-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private FindCommandParser parser \u003d new FindCommandParser();","lastModifiedDate":"2017-06-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void parse_emptyArg_throwsParseException() {","lastModifiedDate":"2017-06-27"},{"lineNumber":20,"author":{"gitId":"agreatdayy"},"content":" assertParseFailure(parser, \" \",","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"agreatdayy"},"content":" String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsFindCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // no leading and trailing whitespaces","lastModifiedDate":"2017-06-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" FindCommand expectedFindCommand \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\")));","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"Alice Bob\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // multiple whitespaces between keywords","lastModifiedDate":"2017-06-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \" \\n Alice \\n \\t Bob \\t\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-27"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":5,"-":27}},{"path":"src/test/java/tutorpro/logic/parser/ParserUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.logic.parser;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.parser.ParserUtil.MESSAGE_INVALID_INDEX;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-05-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-05-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-05-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.exceptions.ParseException;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtilTest {","lastModifiedDate":"2017-05-22"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2017-05-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2017-05-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2017-05-22"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d \"Rachel Walker\";","lastModifiedDate":"2017-05-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d \"123456\";","lastModifiedDate":"2017-05-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d \"123 Main Street #0505\";","lastModifiedDate":"2017-05-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d \"rachel@example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_1 \u003d \"friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_2 \u003d \"neighbour\";","lastModifiedDate":"2017-05-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String WHITESPACE \u003d \" \\t\\r\\n\";","lastModifiedDate":"2017-05-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void parseIndex_invalidInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseIndex(\"10 a\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void parseIndex_outOfRangeInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_INVALID_INDEX, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" -\u003e ParserUtil.parseIndex(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2019-03-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void parseIndex_validInput_success() throws Exception {","lastModifiedDate":"2017-05-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // No whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\"1\"));","lastModifiedDate":"2017-05-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // Leading and trailing whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\" 1 \"));","lastModifiedDate":"2017-05-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void parseName_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseName((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parseName_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseName(INVALID_NAME));","lastModifiedDate":"2019-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parseName_validValueWithoutWhitespace_returnsName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(VALID_NAME));","lastModifiedDate":"2017-05-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String nameWithWhitespace \u003d WHITESPACE + VALID_NAME + WHITESPACE;","lastModifiedDate":"2017-05-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace));","lastModifiedDate":"2017-05-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void parsePhone_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePhone((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void parsePhone_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePhone(INVALID_PHONE));","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-22"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE));","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" String phoneWithWhitespace \u003d WHITESPACE + VALID_PHONE + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void parseAddress_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseAddress((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":110,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":111,"author":{"gitId":"-"},"content":" public void parseAddress_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseAddress(INVALID_ADDRESS));","lastModifiedDate":"2019-03-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":115,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-22"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":123,"author":{"gitId":"-"},"content":" String addressWithWhitespace \u003d WHITESPACE + VALID_ADDRESS + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-30"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public void parseEmail_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmail((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public void parseEmail_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmail(INVALID_EMAIL));","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-22"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL));","lastModifiedDate":"2017-05-30"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" String emailWithWhitespace \u003d WHITESPACE + VALID_EMAIL + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-30"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void parseTag_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTag(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":156,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public void parseTag_invalidValue_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTag(INVALID_TAG));","lastModifiedDate":"2019-03-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":161,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithoutWhitespace_returnsTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":163,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":164,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(VALID_TAG_1));","lastModifiedDate":"2017-05-30"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":167,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":168,"author":{"gitId":"-"},"content":" public void parseTag_validValueWithWhitespace_returnsTrimmedTag() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":169,"author":{"gitId":"-"},"content":" String tagWithWhitespace \u003d WHITESPACE + VALID_TAG_1 + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG_1);","lastModifiedDate":"2017-05-30"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(tagWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public void parseTags_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTags(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":179,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":180,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithInvalidTags_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, INVALID_TAG)));","lastModifiedDate":"2019-03-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":184,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public void parseTags_emptyCollection_returnsEmptySet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":186,"author":{"gitId":"-"},"content":" assertTrue(ParserUtil.parseTags(Collections.emptyList()).isEmpty());","lastModifiedDate":"2017-05-22"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":189,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":191,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e actualTagSet \u003d ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, VALID_TAG_2));","lastModifiedDate":"2017-05-22"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e expectedTagSet \u003d new HashSet\u003cTag\u003e(Arrays.asList(new Tag(VALID_TAG_1), new Tag(VALID_TAG_2)));","lastModifiedDate":"2017-05-22"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":194,"author":{"gitId":"-"},"content":" assertEquals(expectedTagSet, actualTagSet);","lastModifiedDate":"2017-05-22"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-22"}],"authorContributionMap":{"Wyrkx":10,"-":186}},{"path":"src/test/java/tutorpro/model/AddressBookTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2016-12-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2016-12-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-12-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-12-24"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookTest {","lastModifiedDate":"2016-12-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2016-12-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), addressBook.getPersonList());","lastModifiedDate":"2016-12-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e addressBook.resetData(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void resetData_withValidReadOnlyAddressBook_replacesData() {","lastModifiedDate":"2016-12-24"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" AddressBook newData \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" addressBook.resetData(newData);","lastModifiedDate":"2016-12-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(newData, addressBook);","lastModifiedDate":"2016-12-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void resetData_withDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Two persons with the same identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":49,"author":{"gitId":"agreatdayy"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE)","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"agreatdayy"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" List\u003cPerson\u003e newPersons \u003d Arrays.asList(TypicalPersons.ALICE, editedAlice);","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBookStub newData \u003d new AddressBookStub(newPersons);","lastModifiedDate":"2018-03-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e addressBook.resetData(newData));","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e addressBook.hasPerson(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" assertFalse(addressBook.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":" addressBook.addPerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":" assertTrue(addressBook.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" addressBook.addPerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"agreatdayy"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE)","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"agreatdayy"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertTrue(addressBook.hasPerson(editedAlice));","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void getPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, () -\u003e addressBook.getPersonList().remove(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expected \u003d AddressBook.class.getCanonicalName() + \"{persons\u003d\" + addressBook.getPersonList() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertEquals(expected, addressBook.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * A stub ReadOnlyAddressBook whose persons list can violate interface constraints.","lastModifiedDate":"2018-03-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static class AddressBookStub implements ReadOnlyAddressBook {","lastModifiedDate":"2016-12-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e persons \u003d FXCollections.observableArrayList();","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" AddressBookStub(Collection\u003cPerson\u003e persons) {","lastModifiedDate":"2018-03-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.persons.setAll(persons);","lastModifiedDate":"2016-12-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return persons;","lastModifiedDate":"2016-12-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-24"}],"authorContributionMap":{"agreatdayy":6,"Wyrkx":17,"-":85}},{"path":"src/test/java/tutorpro/model/ModelManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-31"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.AddressBookBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ModelManagerTest {","lastModifiedDate":"2017-05-31"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private ModelManager modelManager \u003d new ModelManager();","lastModifiedDate":"2018-08-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(new GuiSettings(), modelManager.getGuiSettings());","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(new AddressBook(), new AddressBook(modelManager.getAddressBook()));","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefs_nullUserPrefs_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.setUserPrefs(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void setUserPrefs_validUserPrefs_copiesUserPrefs() {","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"address/book/file/path\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1, 2, 3, 4));","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" modelManager.setUserPrefs(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(userPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Modifying userPrefs should not modify modelManager\u0027s userPrefs","lastModifiedDate":"2018-12-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs oldUserPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"new/address/book/file/path\"));","lastModifiedDate":"2018-12-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(oldUserPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.setGuiSettings(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setGuiSettings_validGuiSettings_setsGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(1, 2, 3, 4);","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" modelManager.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(guiSettings, modelManager.getGuiSettings());","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.setAddressBookFilePath(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_validPath_setsAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Path path \u003d Paths.get(\"address/book/file/path\");","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" modelManager.setAddressBookFilePath(path);","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(path, modelManager.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e modelManager.hasPerson(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" assertFalse(modelManager.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"Wyrkx"},"content":" modelManager.addPerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" assertTrue(modelManager.hasPerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, () -\u003e modelManager.getFilteredPersonList().remove(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-31"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"agreatdayy"},"content":" AddressBook addressBook \u003d new AddressBookBuilder()","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"agreatdayy"},"content":" .withPerson(TypicalPersons.ALICE).withPerson(TypicalPersons.BENSON).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"-"},"content":" AddressBook differentAddressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":101,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":" modelManager \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2018-08-06"},{"lineNumber":105,"author":{"gitId":"-"},"content":" ModelManager modelManagerCopy \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2017-05-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManagerCopy));","lastModifiedDate":"2017-05-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManager));","lastModifiedDate":"2017-05-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(null));","lastModifiedDate":"2017-05-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(5));","lastModifiedDate":"2017-05-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // different addressBook -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(differentAddressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // different filteredList -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":121,"author":{"gitId":"Wyrkx"},"content":" String[] keywords \u003d TypicalPersons.ALICE.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2024-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(keywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // resets modelManager to initial state for upcoming tests","lastModifiedDate":"2017-08-05"},{"lineNumber":126,"author":{"gitId":"Wyrkx"},"content":" modelManager.updateFilteredPersonList(Model.PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2024-03-11"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // different userPrefs -\u003e returns false","lastModifiedDate":"2018-11-27"},{"lineNumber":129,"author":{"gitId":"-"},"content":" UserPrefs differentUserPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":" differentUserPrefs.setAddressBookFilePath(Paths.get(\"differentFilePath\"));","lastModifiedDate":"2018-08-09"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, differentUserPrefs)));","lastModifiedDate":"2018-11-27"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-31"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":19,"-":111}},{"path":"src/test/java/tutorpro/model/UserPrefsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class UserPrefsTest {","lastModifiedDate":"2018-11-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":" UserPrefs userPref \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e userPref.setGuiSettings(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e userPrefs.setAddressBookFilePath(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-11-27"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":4,"-":18}},{"path":"src/test/java/tutorpro/model/person/AddressTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AddressTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Address(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void constructor_invalidAddress_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" String invalidAddress \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Address(invalidAddress));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void isValidAddress() {","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // null address","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Address.isValidAddress(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // invalid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Address.isValidAddress(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Address.isValidAddress(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // valid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"Blk 456, Den Road, #01-355\"));","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertTrue(Address.isValidAddress(\"-\")); // one character","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"agreatdayy"},"content":" assertTrue(Address","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"agreatdayy"},"content":" .isValidAddress(\"Leng Inc; 1234 Market St; San Francisco CA 2349879; USA\")); // long address","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Address address \u003d new Address(\"Valid Address\");","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(address.equals(new Address(\"Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertTrue(address.equals(address));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(address.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(address.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(address.equals(new Address(\"Other Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"agreatdayy":3,"Wyrkx":5,"-":51}},{"path":"src/test/java/tutorpro/model/person/EmailTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class EmailTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Email(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void constructor_invalidEmail_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" String invalidEmail \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Email(invalidEmail));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void isValidEmail() {","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // null email","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Email.isValidEmail(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // blank email","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // missing parts","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"@example.com\")); // missing local part","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjackexample.com\")); // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@\")); // missing domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // invalid parts","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@-\")); // invalid domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@exam_ple.com\")); // underscore in domain name","lastModifiedDate":"2018-02-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter jack@example.com\")); // spaces in local part","lastModifiedDate":"2017-04-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@exam ple.com\")); // spaces in domain name","lastModifiedDate":"2017-04-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\" peterjack@example.com\")); // leading space","lastModifiedDate":"2018-02-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com \")); // trailing space","lastModifiedDate":"2018-02-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@@example.com\")); // double \u0027@\u0027 symbol","lastModifiedDate":"2017-04-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter@jack@example.com\")); // \u0027@\u0027 symbol in local part","lastModifiedDate":"2017-04-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"-peterjack@example.com\")); // local part starts with a hyphen","lastModifiedDate":"2021-07-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack-@example.com\")); // local part ends with a hyphen","lastModifiedDate":"2021-07-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peter..jack@example.com\")); // local part has two consecutive periods","lastModifiedDate":"2021-07-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example@com\")); // \u0027@\u0027 symbol in domain name","lastModifiedDate":"2017-04-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@.example.com\")); // domain name starts with a period","lastModifiedDate":"2018-02-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com.\")); // domain name ends with a period","lastModifiedDate":"2018-02-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@-example.com\")); // domain name starts with a hyphen","lastModifiedDate":"2018-02-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.com-\")); // domain name ends with a hyphen","lastModifiedDate":"2018-02-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertFalse(Email.isValidEmail(\"peterjack@example.c\")); // top level domain has less than two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // valid email","lastModifiedDate":"2017-01-16"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack_1190@example.com\")); // underscore in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack.1190@example.com\")); // period in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack+1190@example.com\")); // \u0027+\u0027 symbol in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"PeterJack-1190@example.com\")); // hyphen in local part","lastModifiedDate":"2021-07-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"a@bc\")); // minimal","lastModifiedDate":"2018-02-09"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"test@localhost\")); // alphabets only","lastModifiedDate":"2017-01-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"123@145\")); // numeric local part and domain name","lastModifiedDate":"2017-01-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"a1+be.d@example1.com\")); // mixture of alphanumeric and special characters","lastModifiedDate":"2021-07-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"peter_jack@very-very-very-long-example.com\")); // long domain name","lastModifiedDate":"2018-02-09"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"if.you.dream.it_you.can.do.it@example.com\")); // long local part","lastModifiedDate":"2017-04-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertTrue(Email.isValidEmail(\"e1234567@u.nus.edu\")); // more than one period in domain","lastModifiedDate":"2021-07-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Email email \u003d new Email(\"valid@email\");","lastModifiedDate":"2019-02-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertTrue(email.equals(new Email(\"valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertTrue(email.equals(email));","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(email.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertFalse(email.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertFalse(email.equals(new Email(\"other.valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":5,"-":84}},{"path":"src/test/java/tutorpro/model/person/NameContainsKeywordsPredicateTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicateTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" List\u003cString\u003e firstPredicateKeywordList \u003d Collections.singletonList(\"first\");","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" List\u003cString\u003e secondPredicateKeywordList \u003d Arrays.asList(\"first\", \"second\");","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":" new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"agreatdayy"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"agreatdayy"},"content":" new NameContainsKeywordsPredicate(secondPredicateKeywordList);","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"agreatdayy"},"content":" NameContainsKeywordsPredicate firstPredicateCopy \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"agreatdayy"},"content":" new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicateCopy));","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(1));","lastModifiedDate":"2017-06-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(null));","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(secondPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public void test_nameContainsKeywords_returnsTrue() {","lastModifiedDate":"2017-08-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // One keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":48,"author":{"gitId":"agreatdayy"},"content":" NameContainsKeywordsPredicate predicate \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"agreatdayy"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"Alice\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // Multiple keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // Only one matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Bob\", \"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Carol\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // Mixed-case keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"aLIce\", \"bOB\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void test_nameDoesNotContainKeywords_returnsFalse() {","lastModifiedDate":"2017-08-15"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // Zero keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Collections.emptyList());","lastModifiedDate":"2017-06-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // Non-matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":" // Keywords match phone, email and address, but does not match name","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"12345\", \"alice@email.com\", \"Main\", \"Street\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").withPhone(\"12345\")","lastModifiedDate":"2017-06-12"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .withEmail(\"alice@email.com\").withAddress(\"Main Street\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d List.of(\"keyword1\", \"keyword2\");","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(keywords);","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" String expected \u003d NameContainsKeywordsPredicate.class.getCanonicalName() + \"{keywords\u003d\" + keywords + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertEquals(expected, predicate.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"agreatdayy":8,"Wyrkx":2,"-":79}},{"path":"src/test/java/tutorpro/model/person/NameTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class NameTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Name(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void constructor_invalidName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" String invalidName \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Name(invalidName));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void isValidName() {","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // null name","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Name.isValidName(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(Name.isValidName(\"peter*\")); // contains non-alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // valid name","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"peter jack\")); // alphabets only","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"12345\")); // numbers only","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"peter the 2nd\")); // alphanumeric characters","lastModifiedDate":"2017-01-16"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"Capital Tan\")); // with capital letters","lastModifiedDate":"2017-01-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertTrue(Name.isValidName(\"David Roger Jackson Ray Jr 2nd\")); // long names","lastModifiedDate":"2017-01-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Name name \u003d new Name(\"Valid Name\");","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertTrue(name.equals(new Name(\"Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertTrue(name.equals(name));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(name.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(name.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertFalse(name.equals(new Name(\"Other Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":5,"-":56}},{"path":"src/test/java/tutorpro/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"public class PersonTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" public void isSamePerson() {","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.isSamePerson(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.isSamePerson(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"agreatdayy"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE)","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"agreatdayy"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"Wyrkx"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":" Person editedBob \u003d new PersonBuilder(TypicalPersons.BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.BOB.isSamePerson(editedBob));","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" editedBob \u003d new PersonBuilder(TypicalPersons.BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.BOB.isSamePerson(editedBob));","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" public void equals() {","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"Wyrkx"},"content":" Person aliceCopy \u003d new PersonBuilder(TypicalPersons.ALICE).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.equals(aliceCopy));","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"Wyrkx"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertTrue(TypicalPersons.ALICE.equals(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"Wyrkx"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" // different type -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(5));","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"Wyrkx"},"content":" // different person -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(TypicalPersons.BOB));","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"Wyrkx"},"content":" // different name -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"Wyrkx"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" // different email -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"Wyrkx"},"content":" // different address -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"Wyrkx"},"content":" editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertFalse(TypicalPersons.ALICE.equals(editedAlice));","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"Wyrkx"},"content":" public void toStringMethod() {","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"agreatdayy"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + TypicalPersons.ALICE.getName()","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"agreatdayy"},"content":" + \", phone\u003d\" + TypicalPersons.ALICE.getPhone() + \", email\u003d\" + TypicalPersons.ALICE.getEmail()","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"agreatdayy"},"content":" + \", address\u003d\" + TypicalPersons.ALICE.getAddress() + \", tags\u003d\" + TypicalPersons.ALICE.getTags() + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(expected, TypicalPersons.ALICE.toString());","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":10,"Wyrkx":92}},{"path":"src/test/java/tutorpro/model/person/PhoneTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class PhoneTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Phone(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void constructor_invalidPhone_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":" String invalidPhone \u003d \"\";","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Phone(invalidPhone));","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void isValidPhone() {","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // null phone number","lastModifiedDate":"2017-12-04"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Phone.isValidPhone(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // invalid phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"\")); // empty string","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\" \")); // spaces only","lastModifiedDate":"2017-01-16"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"91\")); // less than 3 numbers","lastModifiedDate":"2017-05-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"phone\")); // non-numeric","lastModifiedDate":"2017-01-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"9011p041\")); // alphabets within digits","lastModifiedDate":"2017-01-16"},{"lineNumber":35,"author":{"gitId":"-"},"content":" assertFalse(Phone.isValidPhone(\"9312 1534\")); // spaces within digits","lastModifiedDate":"2017-01-16"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // valid phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"911\")); // exactly 3 numbers","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"93121534\"));","lastModifiedDate":"2017-01-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertTrue(Phone.isValidPhone(\"124293842033123\")); // long phone numbers","lastModifiedDate":"2017-01-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Phone phone \u003d new Phone(\"999\");","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(new Phone(\"999\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(phone));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(new Phone(\"995\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":5,"-":56}},{"path":"src/test/java/tutorpro/model/person/UniquePersonListTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.testutil.PersonBuilder;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"public class UniquePersonListTest {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final UniquePersonList uniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void contains_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.contains(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void contains_personNotInList_returnsFalse() {","lastModifiedDate":"2018-08-08"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" assertFalse(uniquePersonList.contains(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void contains_personInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" assertTrue(uniquePersonList.contains(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void contains_personWithSameIdentityFieldsInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"agreatdayy"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE)","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"agreatdayy"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(uniquePersonList.contains(editedAlice));","lastModifiedDate":"2018-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void add_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.add(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void add_duplicatePerson_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.add(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void setPerson_nullTargetPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":63,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"agreatdayy"},"content":" .setPerson(null, TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void setPerson_nullEditedPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":69,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"agreatdayy"},"content":" .setPerson(TypicalPersons.ALICE, null));","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void setPerson_targetPersonNotInList_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"agreatdayy"},"content":" .setPerson(TypicalPersons.ALICE, TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonIsSamePerson_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.setPerson(TypicalPersons.ALICE, TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasSameIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"agreatdayy"},"content":" Person editedAlice \u003d new PersonBuilder(TypicalPersons.ALICE)","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"agreatdayy"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.setPerson(TypicalPersons.ALICE, editedAlice);","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(editedAlice);","lastModifiedDate":"2018-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasDifferentIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":101,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.setPerson(TypicalPersons.ALICE, TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":104,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasNonUniqueIdentity_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":110,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"agreatdayy"},"content":" .setPerson(TypicalPersons.ALICE, TypicalPersons.BOB));","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public void remove_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":118,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.remove(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public void remove_personDoesNotExist_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":123,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList.remove(TypicalPersons.ALICE));","lastModifiedDate":"2024-03-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void remove_existingPerson_removesPerson() {","lastModifiedDate":"2018-08-08"},{"lineNumber":128,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":129,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.remove(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":130,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" public void setPersons_nullUniquePersonList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":136,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((UniquePersonList) null));","lastModifiedDate":"2024-03-11"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public void setPersons_uniquePersonList_replacesOwnListWithProvidedUniquePersonList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":141,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":142,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":143,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":144,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(expectedUniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":148,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":149,"author":{"gitId":"-"},"content":" public void setPersons_nullList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":150,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((List\u003cPerson\u003e) null));","lastModifiedDate":"2024-03-11"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":153,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public void setPersons_list_replacesOwnListWithProvidedList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":155,"author":{"gitId":"Wyrkx"},"content":" uniquePersonList.add(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":156,"author":{"gitId":"Wyrkx"},"content":" List\u003cPerson\u003e personList \u003d Collections.singletonList(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":157,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(personList);","lastModifiedDate":"2018-08-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":159,"author":{"gitId":"Wyrkx"},"content":" expectedUniquePersonList.add(TypicalPersons.BOB);","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public void setPersons_listWithDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":165,"author":{"gitId":"Wyrkx"},"content":" List\u003cPerson\u003e listWithDuplicatePersons \u003d Arrays.asList(TypicalPersons.ALICE, TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":166,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList","lastModifiedDate":"2024-03-11"},{"lineNumber":167,"author":{"gitId":"agreatdayy"},"content":" .setPersons(listWithDuplicatePersons));","lastModifiedDate":"2024-03-11"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":171,"author":{"gitId":"-"},"content":" public void asUnmodifiableObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2018-04-05"},{"lineNumber":172,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(UnsupportedOperationException.class, ()","lastModifiedDate":"2024-03-11"},{"lineNumber":173,"author":{"gitId":"-"},"content":" -\u003e uniquePersonList.asUnmodifiableObservableList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":176,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-24"},{"lineNumber":177,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-24"},{"lineNumber":178,"author":{"gitId":"-"},"content":" assertEquals(uniquePersonList.asUnmodifiableObservableList().toString(), uniquePersonList.toString());","lastModifiedDate":"2019-02-24"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":180,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"agreatdayy":16,"Wyrkx":38,"-":126}},{"path":"src/test/java/tutorpro/model/tag/TagTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.model.tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"public class TagTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e new Tag(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" public void constructor_invalidTagName_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" String invalidTagName \u003d \"\";","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalArgumentException.class, () -\u003e new Tag(invalidTagName));","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" public void isValidTagName() {","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" // null tag name","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e Tag.isValidTagName(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":26}},{"path":"src/test/java/tutorpro/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"//import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_NAME \u003d TypicalPersons.BENSON.getName().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_PHONE \u003d TypicalPersons.BENSON.getPhone().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_EMAIL \u003d TypicalPersons.BENSON.getEmail().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" private static final String VALID_ADDRESS \u003d TypicalPersons.BENSON.getAddress().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d TypicalPersons.BENSON.getTags().stream()","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(TypicalPersons.BENSON);","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" Assertions.assertEquals(TypicalPersons.BENSON, person.toModelType());","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"agreatdayy"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"agreatdayy"},"content":" new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"agreatdayy"},"content":" String expectedMessage \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"agreatdayy"},"content":" String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"agreatdayy"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"agreatdayy"},"content":" new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"agreatdayy"},"content":" String expectedMessage \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"agreatdayy"},"content":" String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"agreatdayy"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"agreatdayy"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"agreatdayy"},"content":" String expectedMessage \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"agreatdayy"},"content":" String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"agreatdayy"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"agreatdayy"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"agreatdayy"},"content":" String expectedMessage \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"agreatdayy"},"content":" String.format(JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"agreatdayy":18,"Wyrkx":25,"-":76}},{"path":"src/test/java/tutorpro/storage/JsonAddressBookStorageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorageTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"agreatdayy"},"content":" private static final Path TEST_DATA_FOLDER \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":" Paths.get(\"src\", \"test\", \"data\", \"JsonAddressBookStorageTest\");","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void readAddressBook_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e readAddressBook(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private java.util.Optional\u003cReadOnlyAddressBook\u003e readAddressBook(String filePath) throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new JsonAddressBookStorage(Paths.get(filePath)).readAddressBook(addToTestDataPathIfNotNull(filePath));","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) {","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return prefsFileInTestDataFolder !\u003d null","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder)","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void read_missingFile_emptyResult() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertFalse(readAddressBook(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void read_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":49,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"agreatdayy"},"content":" readAddressBook(\"notJsonFormatAddressBook.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void readAddressBook_invalidPersonAddressBook_throwDataLoadingException() {","lastModifiedDate":"2023-06-14"},{"lineNumber":55,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"agreatdayy"},"content":" readAddressBook(\"invalidPersonAddressBook.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void readAddressBook_invalidAndValidPersonAddressBook_throwDataLoadingException() {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"agreatdayy"},"content":" readAddressBook(\"invalidAndValidPersonAddressBook.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void readAndSaveAddressBook_allInOrder_success() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" Path filePath \u003d testFolder.resolve(\"TempAddressBook.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":68,"author":{"gitId":"Wyrkx"},"content":" AddressBook original \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"-"},"content":" JsonAddressBookStorage jsonAddressBookStorage \u003d new JsonAddressBookStorage(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // Save in new file and read back","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook readBack \u003d jsonAddressBookStorage.readAddressBook(filePath).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // Modify data, overwrite exiting file, and read back","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"Wyrkx"},"content":" original.addPerson(TypicalPersons.HOON);","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"Wyrkx"},"content":" original.removePerson(TypicalPersons.ALICE);","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original, filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" readBack \u003d jsonAddressBookStorage.readAddressBook(filePath).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // Save and read without specifying file path","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" original.addPerson(TypicalPersons.IDA);","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" jsonAddressBookStorage.saveAddressBook(original); // file path not specified","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" readBack \u003d jsonAddressBookStorage.readAddressBook().get(); // file path not specified","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(readBack));","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void saveAddressBook_nullAddressBook_throwsNullPointerException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"agreatdayy"},"content":" saveAddressBook(null, \"SomeFile.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Saves {@code addressBook} at the specified {@code filePath}.","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" private void saveAddressBook(ReadOnlyAddressBook addressBook, String filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(Paths.get(filePath))","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" .saveAddressBook(addressBook, addToTestDataPathIfNotNull(filePath));","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" throw new AssertionError(\"There should not be an error writing to the file.\", ioe);","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void saveAddressBook_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e saveAddressBook(new AddressBook(), null));","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"agreatdayy":11,"Wyrkx":12,"-":90}},{"path":"src/test/java/tutorpro/storage/JsonSerializableAddressBookTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.util.JsonUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class JsonSerializableAddressBookTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"agreatdayy"},"content":" private static final Path TEST_DATA_FOLDER \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"agreatdayy"},"content":" Paths.get(\"src\", \"test\", \"data\", \"JsonSerializableAddressBookTest\");","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"agreatdayy"},"content":" private static final Path TYPICAL_PERSONS_FILE \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":" TEST_DATA_FOLDER.resolve(\"typicalPersonsAddressBook.json\");","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":" private static final Path INVALID_PERSON_FILE \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"agreatdayy"},"content":" TEST_DATA_FOLDER.resolve(\"invalidPersonAddressBook.json\");","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"agreatdayy"},"content":" private static final Path DUPLICATE_PERSON_FILE \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"agreatdayy"},"content":" TEST_DATA_FOLDER.resolve(\"duplicatePersonAddressBook.json\");","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void toModelType_typicalPersonsFile_success() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(TYPICAL_PERSONS_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" AddressBook addressBookFromFile \u003d dataFromFile.toModelType();","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" AddressBook typicalPersonsAddressBook \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertEquals(addressBookFromFile, typicalPersonsAddressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void toModelType_invalidPersonFile_throwsIllegalValueException() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(INVALID_PERSON_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, dataFromFile::toModelType);","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void toModelType_duplicatePersons_throwsIllegalValueException() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook dataFromFile \u003d JsonUtil.readJsonFile(DUPLICATE_PERSON_FILE,","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" JsonSerializableAddressBook.class).get();","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(IllegalValueException.class, JsonSerializableAddressBook.MESSAGE_DUPLICATE_PERSON,","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"-"},"content":" dataFromFile::toModelType);","lastModifiedDate":"2019-03-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"agreatdayy":10,"Wyrkx":7,"-":35}},{"path":"src/test/java/tutorpro/storage/JsonUserPrefsStorageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"//import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.exceptions.DataLoadingException;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.Assert;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonUserPrefsStorageTest {","lastModifiedDate":"2016-10-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":" private static final Path TEST_DATA_FOLDER \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":" Paths.get(\"src\", \"test\", \"data\", \"JsonUserPrefsStorageTest\");","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void readUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e readUserPrefs(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private Optional\u003cUserPrefs\u003e readUserPrefs(String userPrefsFileInTestDataFolder) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Path prefsFilePath \u003d addToTestDataPathIfNotNull(userPrefsFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return new JsonUserPrefsStorage(prefsFilePath).readUserPrefs(prefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void readUserPrefs_missingFile_emptyResult() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertFalse(readUserPrefs(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void readUserPrefs_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":45,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(DataLoadingException.class, () -\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"agreatdayy"},"content":" readUserPrefs(\"NotJsonFormatUserPrefs.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String userPrefsFileInTestDataFolder) {","lastModifiedDate":"2018-04-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return userPrefsFileInTestDataFolder !\u003d null","lastModifiedDate":"2016-09-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(userPrefsFileInTestDataFolder)","lastModifiedDate":"2018-04-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void readUserPrefs_fileInOrder_successfullyRead() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":57,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"TypicalUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void readUserPrefs_valuesMissingFromFile_defaultValuesUsed() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"EmptyUserPrefs.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void readUserPrefs_extraValuesInFile_extraValuesIgnored() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"ExtraValuesUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" private UserPrefs getTypicalUserPrefs() {","lastModifiedDate":"2017-02-25"},{"lineNumber":77,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1000, 500, 300, 100));","lastModifiedDate":"2018-11-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"addressbook.json\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return userPrefs;","lastModifiedDate":"2017-02-25"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public void savePrefs_nullPrefs_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":85,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"agreatdayy"},"content":" saveUserPrefs(null, \"SomeFile.json\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":89,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public void saveUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":91,"author":{"gitId":"agreatdayy"},"content":" Assert.assertThrows(NullPointerException.class, () -\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"agreatdayy"},"content":" saveUserPrefs(new UserPrefs(), null));","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-15"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Saves {@code userPrefs} at the specified {@code prefsFileInTestDataFolder} filepath.","lastModifiedDate":"2017-08-15"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"-"},"content":" private void saveUserPrefs(UserPrefs userPrefs, String prefsFileInTestDataFolder) {","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(addToTestDataPathIfNotNull(prefsFileInTestDataFolder))","lastModifiedDate":"2016-10-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":" .saveUserPrefs(userPrefs);","lastModifiedDate":"2016-10-12"},{"lineNumber":102,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":103,"author":{"gitId":"-"},"content":" throw new AssertionError(\"There should not be an error writing to the file\", ioe);","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public void saveUserPrefs_allInOrder_success() throws DataLoadingException, IOException {","lastModifiedDate":"2023-06-14"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":110,"author":{"gitId":"-"},"content":" UserPrefs original \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(1200, 200, 0, 2));","lastModifiedDate":"2018-11-27"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Path pefsFilePath \u003d testFolder.resolve(\"TempPrefs.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage jsonUserPrefsStorage \u003d new JsonUserPrefsStorage(pefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":" //Try writing when the file doesn\u0027t exist","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":118,"author":{"gitId":"-"},"content":" UserPrefs readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":121,"author":{"gitId":"-"},"content":" //Try saving when the file exists","lastModifiedDate":"2016-09-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(5, 5, 5, 5));","lastModifiedDate":"2018-11-27"},{"lineNumber":123,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":124,"author":{"gitId":"-"},"content":" readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"agreatdayy":9,"Wyrkx":6,"-":113}},{"path":"src/test/java/tutorpro/storage/StorageManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.GuiSettings;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.ReadOnlyAddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.UserPrefs;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.testutil.TypicalPersons;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class StorageManagerTest {","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private StorageManager storageManager;","lastModifiedDate":"2017-04-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2016-10-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(getTempFilePath(\"ab\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(getTempFilePath(\"prefs\"));","lastModifiedDate":"2017-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" storageManager \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2017-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Path getTempFilePath(String fileName) {","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return testFolder.resolve(fileName);","lastModifiedDate":"2019-04-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void prefsReadSave() throws Exception {","lastModifiedDate":"2016-10-16"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-09-28"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Note: This is an integration test that verifies the StorageManager is properly wired to the","lastModifiedDate":"2016-09-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * {@link JsonUserPrefsStorage} class.","lastModifiedDate":"2016-10-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * More extensive testing of UserPref saving/reading is done in {@link JsonUserPrefsStorageTest} class.","lastModifiedDate":"2016-10-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":" UserPrefs original \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(300, 600, 4, 6));","lastModifiedDate":"2018-11-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" storageManager.saveUserPrefs(original);","lastModifiedDate":"2016-09-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs retrieved \u003d storageManager.readUserPrefs().get();","lastModifiedDate":"2016-09-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertEquals(original, retrieved);","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void addressBookReadSave() throws Exception {","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-10-16"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Note: This is an integration test that verifies the StorageManager is properly wired to the","lastModifiedDate":"2016-10-16"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * {@link JsonAddressBookStorage} class.","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * More extensive testing of UserPref saving/reading is done in {@link JsonAddressBookStorageTest} class.","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" AddressBook original \u003d TypicalPersons.getTypicalAddressBook();","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"-"},"content":" storageManager.saveAddressBook(original);","lastModifiedDate":"2016-09-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ReadOnlyAddressBook retrieved \u003d storageManager.readAddressBook().get();","lastModifiedDate":"2016-09-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertEquals(original, new AddressBook(retrieved));","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void getAddressBookFilePath() {","lastModifiedDate":"2016-10-01"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertNotNull(storageManager.getAddressBookFilePath());","lastModifiedDate":"2016-10-01"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-01"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-01"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":7,"-":61}},{"path":"src/test/java/tutorpro/testutil/AddressBookBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * A utility class to help with building Addressbook objects.","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Example usage: \u003cbr\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * {@code AddressBook ab \u003d new AddressBookBuilder().withPerson(\"John\", \"Doe\").build();}","lastModifiedDate":"2018-03-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AddressBookBuilder {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private AddressBook addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public AddressBookBuilder() {","lastModifiedDate":"2017-05-31"},{"lineNumber":16,"author":{"gitId":"-"},"content":" addressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public AddressBookBuilder(AddressBook addressBook) {","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":" this.addressBook \u003d addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Adds a new {@code Person} to the {@code AddressBook} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public AddressBookBuilder withPerson(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" addressBook.addPerson(person);","lastModifiedDate":"2016-09-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddressBook build() {","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return addressBook;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":3,"-":31}},{"path":"src/test/java/tutorpro/testutil/Assert.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;","lastModifiedDate":"2019-03-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.function.Executable;","lastModifiedDate":"2019-03-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-03-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-17"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * A set of assertion methods useful for writing tests.","lastModifiedDate":"2017-07-17"},{"lineNumber":8,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class Assert {","lastModifiedDate":"2017-07-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Asserts that the {@code executable} throws the {@code expectedType} Exception.","lastModifiedDate":"2019-03-13"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":" * This is a wrapper method that invokes {@link Assertions#assertThrows(Class, Executable)},","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":" * to maintain consistency with our custom {@link #assertThrows(Class, String, Executable)} method.","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * To standardize API calls in this project, users should use this method instead of","lastModifiedDate":"2019-03-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * {@link Assertions#assertThrows(Class, Executable)}.","lastModifiedDate":"2019-03-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static void assertThrows(Class\u003c? extends Throwable\u003e expectedType, Executable executable) {","lastModifiedDate":"2019-03-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Assertions.assertThrows(expectedType, executable);","lastModifiedDate":"2019-03-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-02-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-02-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-02-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Asserts that the {@code executable} throws the {@code expectedType} Exception with the {@code expectedMessage}.","lastModifiedDate":"2019-03-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * If there\u0027s no need for the verification of the exception\u0027s error message, call","lastModifiedDate":"2018-02-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * {@link #assertThrows(Class, Executable)} instead.","lastModifiedDate":"2019-03-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2019-03-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @see #assertThrows(Class, Executable)","lastModifiedDate":"2019-03-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-02-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static void assertThrows(Class\u003c? extends Throwable\u003e expectedType, String expectedMessage,","lastModifiedDate":"2019-03-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Executable executable) {","lastModifiedDate":"2019-03-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Throwable thrownException \u003d Assertions.assertThrows(expectedType, executable);","lastModifiedDate":"2019-03-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedMessage, thrownException.getMessage());","lastModifiedDate":"2019-03-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-17"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-17"}],"authorContributionMap":{"agreatdayy":2,"Wyrkx":1,"-":31}},{"path":"src/test/java/tutorpro/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" private EditCommand.EditPersonDescriptor descriptor;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" public EditPersonDescriptorBuilder(EditCommand.EditPersonDescriptor descriptor) {","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" this.descriptor \u003d new EditCommand.EditPersonDescriptor(descriptor);","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" descriptor \u003d new EditCommand.EditPersonDescriptor();","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"Wyrkx"},"content":" public EditCommand.EditPersonDescriptor build() {","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"agreatdayy":1,"Wyrkx":13,"-":73}},{"path":"src/test/java/tutorpro/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Address;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Email;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Name;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Phone;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.util.SampleDataUtil;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":60,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":84,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" return new Person(name, phone, email, address, tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":96,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"Wyrkx":8,"-":88}},{"path":"src/test/java/tutorpro/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import java.util.Set;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.AddCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.commands.EditCommand;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.logic.parser.CliSyntax;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"agreatdayy"},"content":"import tutorpro.model.tag.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"/**","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":" * A utility class for Person.","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"public class PersonUtil {","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"Wyrkx"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"Wyrkx"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"Wyrkx"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"Wyrkx"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"Wyrkx"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"Wyrkx"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"Wyrkx"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"Wyrkx"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"Wyrkx"},"content":" s -\u003e sb.append(CliSyntax.PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"Wyrkx"},"content":" );","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"Wyrkx"},"content":" return sb.toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"Wyrkx"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"Wyrkx"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"Wyrkx"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"Wyrkx"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"Wyrkx"},"content":" public static String getEditPersonDescriptorDetails(EditCommand.EditPersonDescriptor descriptor) {","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"Wyrkx"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"Wyrkx"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(CliSyntax.PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"Wyrkx"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(CliSyntax.PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"Wyrkx"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(CliSyntax.PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"agreatdayy"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(CliSyntax.PREFIX_ADDRESS)","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"agreatdayy"},"content":" .append(address.value).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"Wyrkx"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"Wyrkx"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"Wyrkx"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"Wyrkx"},"content":" sb.append(CliSyntax.PREFIX_TAG);","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"Wyrkx"},"content":" } else {","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"Wyrkx"},"content":" tags.forEach(s -\u003e sb.append(CliSyntax.PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"Wyrkx"},"content":" return sb.toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"Wyrkx"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Wyrkx"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"agreatdayy":4,"Wyrkx":54}},{"path":"src/test/java/tutorpro/testutil/SerializableTestClass.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;","lastModifiedDate":"2016-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2016-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.HashMap;","lastModifiedDate":"2016-08-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * A class used to test serialization and deserialization","lastModifiedDate":"2016-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class SerializableTestClass {","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String JSON_STRING_REPRESENTATION \u003d String.format(\"{%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \" \\\"name\\\" : \\\"This is a test class\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" + \" \\\"listOfLocalDateTimes\\\" : \"","lastModifiedDate":"2016-10-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \"[ \\\"-999999999-01-01T00:00:00\\\", \\\"+999999999-12-31T23:59:59.999999999\\\", \"","lastModifiedDate":"2016-10-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"\\\"0001-01-01T01:01:00\\\" ],%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \" \\\"mapOfIntegerToString\\\" : {%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \" \\\"1\\\" : \\\"One\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \" \\\"2\\\" : \\\"Two\\\",%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \" \\\"3\\\" : \\\"Three\\\"%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \" }%n\"","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \"}\");","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String NAME_TEST_VALUE \u003d \"This is a test class\";","lastModifiedDate":"2016-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private String name;","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private List\u003cLocalDateTime\u003e listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private HashMap\u003cInteger, String\u003e mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static String getNameTestValue() {","lastModifiedDate":"2016-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return NAME_TEST_VALUE;","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static List\u003cLocalDateTime\u003e getListTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" List\u003cLocalDateTime\u003e listOfLocalDateTimes \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.MIN);","lastModifiedDate":"2016-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.MAX);","lastModifiedDate":"2016-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" listOfLocalDateTimes.add(LocalDateTime.of(1, 1, 1, 1, 1));","lastModifiedDate":"2016-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static HashMap\u003cInteger, String\u003e getHashMapTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" HashMap\u003cInteger, String\u003e mapOfIntegerToString \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2016-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(1, \"One\");","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(2, \"Two\");","lastModifiedDate":"2016-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" mapOfIntegerToString.put(3, \"Three\");","lastModifiedDate":"2016-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void setTestValues() {","lastModifiedDate":"2016-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" name \u003d getNameTestValue();","lastModifiedDate":"2016-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" listOfLocalDateTimes \u003d getListTestValues();","lastModifiedDate":"2016-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" mapOfIntegerToString \u003d getHashMapTestValues();","lastModifiedDate":"2016-08-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public String getName() {","lastModifiedDate":"2016-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2016-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public List\u003cLocalDateTime\u003e getListOfLocalDateTimes() {","lastModifiedDate":"2016-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return listOfLocalDateTimes;","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public HashMap\u003cInteger, String\u003e getMapOfIntegerToString() {","lastModifiedDate":"2016-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return mapOfIntegerToString;","lastModifiedDate":"2016-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":1,"-":71}},{"path":"src/test/java/tutorpro/testutil/TestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.Model;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * A utility class for test cases.","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class TestUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Folder used for temp files created during testing. Ignored by Git.","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final Path SANDBOX_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"sandbox\");","lastModifiedDate":"2018-04-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Appends {@code fileName} to the sandbox folder path and returns the resulting path.","lastModifiedDate":"2018-04-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Creates the sandbox folder if it doesn\u0027t exist.","lastModifiedDate":"2016-09-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static Path getFilePathInSandboxFolder(String fileName) {","lastModifiedDate":"2018-04-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-09-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Files.createDirectories(SANDBOX_FOLDER);","lastModifiedDate":"2018-04-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-09-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":" throw new RuntimeException(e);","lastModifiedDate":"2016-09-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" return SANDBOX_FOLDER.resolve(fileName);","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Returns the middle index of the person in the {@code model}\u0027s person list.","lastModifiedDate":"2017-07-30"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static Index getMidIndex(Model model) {","lastModifiedDate":"2017-07-30"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return Index.fromOneBased(model.getFilteredPersonList().size() / 2);","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Returns the last index of the person in the {@code model}\u0027s person list.","lastModifiedDate":"2017-07-30"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static Index getLastIndex(Model model) {","lastModifiedDate":"2017-07-30"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-30"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns the person in the {@code model}\u0027s person list at {@code index}.","lastModifiedDate":"2017-07-30"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-30"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static Person getPerson(Model model, Index index) {","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return model.getFilteredPersonList().get(index.getZeroBased());","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Wyrkx":4,"-":51}},{"path":"src/test/java/tutorpro/testutil/TypicalIndexes.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.commons.core.index.Index;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Index} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class TypicalIndexes {","lastModifiedDate":"2017-08-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Index INDEX_FIRST_PERSON \u003d Index.fromOneBased(1);","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Index INDEX_SECOND_PERSON \u003d Index.fromOneBased(2);","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Index INDEX_THIRD_PERSON \u003d Index.fromOneBased(3);","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-08-05"}],"authorContributionMap":{"Wyrkx":2,"-":10}},{"path":"src/test/java/tutorpro/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.testutil;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.AddressBook;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2017-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .withEmail(\"heinz@example.com\").withAddress(\"wall street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withEmail(\"cornelia@example.com\").withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2018-03-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .withEmail(\"werner@example.com\").withAddress(\"michegan ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .withEmail(\"lydia@example.com\").withAddress(\"little tokyo\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .withEmail(\"anna@example.com\").withAddress(\"4th street\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .withEmail(\"stefan@example.com\").withAddress(\"little india\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .withEmail(\"hans@example.com\").withAddress(\"chicago ave\").build();","lastModifiedDate":"2017-04-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2017-09-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":68,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":76,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"Wyrkx":13,"-":63}},{"path":"src/test/java/tutorpro/ui/TestFxmlObject.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.beans.DefaultProperty;","lastModifiedDate":"2016-12-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * A test object which can be constructed via an FXML file.","lastModifiedDate":"2016-12-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Unlike other JavaFX classes, this class can be constructed without the JavaFX toolkit being initialized.","lastModifiedDate":"2016-12-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"@DefaultProperty(\"text\")","lastModifiedDate":"2016-12-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class TestFxmlObject {","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private String text;","lastModifiedDate":"2016-12-21"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public TestFxmlObject() {}","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public TestFxmlObject(String text) {","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" setText(text);","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public String getText() {","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return text;","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void setText(String text) {","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.text \u003d text;","lastModifiedDate":"2016-12-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" if (!(other instanceof TestFxmlObject)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" TestFxmlObject otherTestFxmlObject \u003d (TestFxmlObject) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return Objects.equals(text, otherTestFxmlObject.text);","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"Wyrkx":1,"-":44}},{"path":"src/test/java/tutorpro/ui/UiPartTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"Wyrkx"},"content":"package tutorpro.ui;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotNull;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"Wyrkx"},"content":"import static tutorpro.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.net.URL;","lastModifiedDate":"2016-12-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2019-04-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-12-21"},{"lineNumber":14,"author":{"gitId":"Wyrkx"},"content":"import tutorpro.MainApp;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class UiPartTest {","lastModifiedDate":"2016-12-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String MISSING_FILE_PATH \u003d \"UiPartTest/missingFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String INVALID_FILE_PATH \u003d \"UiPartTest/invalidFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String VALID_FILE_PATH \u003d \"UiPartTest/validFile.fxml\";","lastModifiedDate":"2016-12-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String VALID_FILE_WITH_FX_ROOT_PATH \u003d \"UiPartTest/validFileWithFxRoot.fxml\";","lastModifiedDate":"2017-11-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final TestFxmlObject VALID_FILE_ROOT \u003d new TestFxmlObject(\"Hello World!\");","lastModifiedDate":"2016-12-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void constructor_nullFileUrl_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((URL) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((URL) null, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public void constructor_missingFileUrl_throwsAssertionError() throws Exception {","lastModifiedDate":"2016-12-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" URL missingFileUrl \u003d new URL(testFolder.toUri().toURL(), MISSING_FILE_PATH);","lastModifiedDate":"2019-04-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(missingFileUrl));","lastModifiedDate":"2019-03-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(missingFileUrl, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public void constructor_invalidFileUrl_throwsAssertionError() {","lastModifiedDate":"2016-12-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" URL invalidFileUrl \u003d getTestFileUrl(INVALID_FILE_PATH);","lastModifiedDate":"2016-12-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(invalidFileUrl));","lastModifiedDate":"2019-03-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(invalidFileUrl, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void constructor_validFileUrl_loadsFile() {","lastModifiedDate":"2016-12-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" URL validFileUrl \u003d getTestFileUrl(VALID_FILE_PATH);","lastModifiedDate":"2016-12-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, new TestUiPart\u003cTestFxmlObject\u003e(validFileUrl).getRoot());","lastModifiedDate":"2016-12-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-11-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void constructor_validFileWithFxRootUrl_loadsFile() {","lastModifiedDate":"2017-11-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" URL validFileUrl \u003d getTestFileUrl(VALID_FILE_WITH_FX_ROOT_PATH);","lastModifiedDate":"2017-11-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":" TestFxmlObject root \u003d new TestFxmlObject();","lastModifiedDate":"2017-11-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, new TestUiPart\u003cTestFxmlObject\u003e(validFileUrl, root).getRoot());","lastModifiedDate":"2017-11-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void constructor_nullFileName_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e((String) null, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void constructor_missingFileName_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e(MISSING_FILE_PATH));","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new TestUiPart\u003cObject\u003e(MISSING_FILE_PATH, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void constructor_invalidFileName_throwsAssertionError() {","lastModifiedDate":"2016-12-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(INVALID_FILE_PATH));","lastModifiedDate":"2019-03-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertThrows(AssertionError.class, () -\u003e new TestUiPart\u003cObject\u003e(INVALID_FILE_PATH, new Object()));","lastModifiedDate":"2019-03-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":78,"author":{"gitId":"-"},"content":" private URL getTestFileUrl(String testFilePath) {","lastModifiedDate":"2016-12-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String testFilePathInView \u003d \"/view/\" + testFilePath;","lastModifiedDate":"2016-12-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" URL testFileUrl \u003d MainApp.class.getResource(testFilePathInView);","lastModifiedDate":"2016-12-21"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertNotNull(testFileUrl, testFilePathInView + \" does not exist.\");","lastModifiedDate":"2019-03-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return testFileUrl;","lastModifiedDate":"2016-12-21"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-21"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * UiPart used for testing.","lastModifiedDate":"2016-12-21"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * It should only be used with invalid FXML files or the valid file located at {@link VALID_FILE_PATH}.","lastModifiedDate":"2016-12-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" private static class TestUiPart\u003cT\u003e extends UiPart\u003cT\u003e {","lastModifiedDate":"2016-12-21"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-12-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private TestFxmlObject validFileRoot; // Check that @FXML annotations work","lastModifiedDate":"2016-12-21"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":94,"author":{"gitId":"-"},"content":" TestUiPart(URL fxmlFileUrl, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":" super(fxmlFileUrl, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":" TestUiPart(String fxmlFileName, T root) {","lastModifiedDate":"2017-11-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":" super(fxmlFileName, root);","lastModifiedDate":"2017-11-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-11-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":" TestUiPart(URL fxmlFileUrl) {","lastModifiedDate":"2016-12-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":" super(fxmlFileUrl);","lastModifiedDate":"2016-12-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, validFileRoot);","lastModifiedDate":"2016-12-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":107,"author":{"gitId":"-"},"content":" TestUiPart(String fxmlFileName) {","lastModifiedDate":"2016-12-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":" super(fxmlFileName);","lastModifiedDate":"2016-12-21"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(VALID_FILE_ROOT, validFileRoot);","lastModifiedDate":"2016-12-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-21"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"Wyrkx":3,"-":111}},{"path":"src/test/resources/view/UiPartTest/validFile.fxml","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2016-12-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":3,"author":{"gitId":"Wyrkx"},"content":"\u003c?import tutorpro.ui.TestFxmlObject?\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003cTestFxmlObject xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:id\u003d\"validFileRoot\"\u003eHello World!\u003c/TestFxmlObject\u003e","lastModifiedDate":"2016-12-21"}],"authorContributionMap":{"Wyrkx":1,"-":3}},{"path":"src/test/resources/view/UiPartTest/validFileWithFxRoot.fxml","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2017-11-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-11-29"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"\u003cfx:root type\u003d\"tutorpro.ui.TestFxmlObject\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2023-07-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003ctext\u003eHello World!\u003c/text\u003e","lastModifiedDate":"2017-11-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2017-11-29"}],"authorContributionMap":{"agreatdayy":1,"-":5}}] diff --git a/AY2324S2-CS2103T-F12-3_tp_master/commits.json b/AY2324S2-CS2103T-F12-3_tp_master/commits.json index 17bbbad0..bd5bcfda 100644 --- a/AY2324S2-CS2103T-F12-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-F12-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"agreatdayy":[{"date":"2024-02-23","commitResults":[{"hash":"9f1a768a9e2e216bf71bac6ebf5cc41dfbd72805","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Add codecov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-06","commitResults":[{"hash":"588eaab92d71473568ca6d4101ee3c3f597e5ce6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Change project member names","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"88b201c384215cb64c537b9054ee6538f29be751","isMergeCommit":false,"messageTitle":"AboutUs.md: Update Xin Yuan\u0027s info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":12}}},{"hash":"3d40151fde0eb3b09530f20311019f45f2149608","isMergeCommit":false,"messageTitle":"AboutUs.md: Update XY\u0027s github and portfolio","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"49f14c8c7532937ece212c3b9207654c43d55e66","isMergeCommit":false,"messageTitle":"Add xinyuan.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":38,"deletions":0}}},{"hash":"f78f26f647c0a7f32e9cd07e8146546784094a91","isMergeCommit":true,"messageTitle":"Merge pull request #8 from agreatdayy/master","messageBody":"Add xinyuan.md","fileTypesAndContributionMap":{}},{"hash":"07e1e135526ef913ebee04a08addc5a191d9538f","isMergeCommit":false,"messageTitle":"AboutUs.md: Update XY\u0027s photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a538ed2003f6c58d1b191c5f02e612cee6cd036f","isMergeCommit":true,"messageTitle":"Merge pull request #13 from agreatdayy/master","messageBody":"AboutUs.md: Update XY\u0027s photo","fileTypesAndContributionMap":{}},{"hash":"42a1146949f3b56c2dc2543ec2434e08d8a05bf9","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"7e05304554f51862cb21fb75c5c28535ab377a13","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"50bdeb3fda5c74d64181044e19752c4a317d04d4","isMergeCommit":false,"messageTitle":"README.md: Fix UI photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5028c0ce33be4f2c4f2a9e6c2378714c68a168af","isMergeCommit":false,"messageTitle":"README.md: Update link to project website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2a61cde57ea47450174c6b82e5428e762bcd7390","isMergeCommit":true,"messageTitle":"Merge pull request #14 from agreatdayy/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"e43a7e87b27dd3a847fa003563a1be729e50513a","isMergeCommit":false,"messageTitle":"README.md: Acknowledge original source of code","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"581666a0fcb709919af03df7d42251f8ca4b840f","isMergeCommit":true,"messageTitle":"Merge pull request #15 from agreatdayy/master","messageBody":"Update site-wide settings","fileTypesAndContributionMap":{}},{"hash":"e25f12e9c29105f3d961d34f57ae4d23db5e5391","isMergeCommit":false,"messageTitle":"xinyuan.md: Update contents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":11}}},{"hash":"c28add549515a8535c060a1b6d91d63fb3ce0bcf","isMergeCommit":false,"messageTitle":"README.md: Update GitHub Actions build status badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"82eee209e3da3103460bcf7216a81bc3af463ec1","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"7fb75c69d798797ee63c869eeacd2c3419cfe5d5","isMergeCommit":true,"messageTitle":"Merge pull request #16 from agreatdayy/master","messageBody":"Update README.md ","fileTypesAndContributionMap":{}},{"hash":"c58719b023011b56b56d1494ee08ff8afcca45b9","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"7f7652f7ac9c166fe9fe7e3c23bfa934cd0f177e","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4c34c66bd3bbc1ab6fae57e5be84f67241fa40bf","isMergeCommit":false,"messageTitle":"index.md: Fix UI image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8fe54d3a6a584870cb62fc8c3fa48c9f5906d8c9","isMergeCommit":true,"messageTitle":"Merge pull request #17 from agreatdayy/master","messageBody":"Update project website front page","fileTypesAndContributionMap":{}}]}],"Wyrkx":[{"date":"2024-02-24","commitResults":[{"hash":"ee1e19c316aeb35a7fcd63137c65de97f11bcf8b","isMergeCommit":true,"messageTitle":"Merge pull request #1 from agreatdayy/patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"f4eb09bc2a70b18464e8b58b541c2cdf130fea7f","isMergeCommit":true,"messageTitle":"Merge pull request #7 from agreatdayy/master","messageBody":"Update AboutUs.md Test","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"0299eebc67a1ac72a8efdc8ac4d69f3bfff2cd2d","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":37,"deletions":4}}},{"hash":"ce3e63eb43c698b577c0274c95e43b21c46d20af","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Wyrkx/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"b436614f242e5f63c2e59b71cff201b5ce51dca4","isMergeCommit":false,"messageTitle":"Cleanup docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}},{"hash":"e88c4a9102cdfb597c68db210c2b2af29401909e","isMergeCommit":true,"messageTitle":"Merge pull request #21 from Wyrkx/master","messageBody":"Cleanup docs","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"0f09475fed2d5505740a614df0a0a54be44051ac","isMergeCommit":false,"messageTitle":"Refactored packages","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":898,"deletions":891},"test-code":{"insertions":644,"deletions":717}}},{"hash":"b517f0dc1f3007967c25a246827b2e7fcb6e44a4","isMergeCommit":true,"messageTitle":"Merge pull request #22 from Wyrkx/master","messageBody":"Refactored packages","fileTypesAndContributionMap":{}}]}],"TarinPairor":[{"date":"2024-03-06","commitResults":[{"hash":"6b52012a39b39e20f52548f887552c4b2ba728af","isMergeCommit":false,"messageTitle":"AboutUs.md Update Tarin\u0027s info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":11}}}]},{"date":"2024-03-11","commitResults":[{"hash":"ed545568bf8657ef78600adfe47409c5b552afbf","isMergeCommit":false,"messageTitle":"Change Tarin image width","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"tamagochuuu":[{"date":"2024-03-06","commitResults":[{"hash":"983dad91cc06feb3f47c2466a8c605a924e04ae2","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-F12-3/master","messageBody":"Updating my fork","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"bad12b2fa08d2ef25015fbbcfc7434503d7a2b40","isMergeCommit":false,"messageTitle":"Update the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":225,"deletions":30}}},{"hash":"60f87c37998d924a801b1c959735710fd5fcace7","isMergeCommit":true,"messageTitle":"Merge pull request #2 from tamagochuuu/update-dg","messageBody":"Update the DG","fileTypesAndContributionMap":{}},{"hash":"2ef7fcdabdfe11830181a43cc1fef0e27fc5de5e","isMergeCommit":true,"messageTitle":"Merge pull request #18 from tamagochuuu/master","messageBody":"Update the DG","fileTypesAndContributionMap":{}},{"hash":"2e49212be9583f6a53f9724cd0a9eb44ed91d7e2","isMergeCommit":true,"messageTitle":"Merge pull request #3 from AY2324S2-CS2103T-F12-3/master","messageBody":"Update my fork","fileTypesAndContributionMap":{}},{"hash":"15cafe52bbee868caaebaa8801fd39d781b91f4b","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":11}}},{"hash":"41659b97c46e6f6fcbea0492c9ad3e1eafdb07b1","isMergeCommit":true,"messageTitle":"Merge pull request #4 from tamagochuuu/update-aboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"a3eaece9950c3fb5ba8b20fc21dddf8dcaaaf684","isMergeCommit":true,"messageTitle":"Merge pull request #19 from tamagochuuu/master","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"agreatdayy":{"docs":50,"functional-code":0,"test-code":0},"Wyrkx":{"docs":40,"functional-code":363,"test-code":1176},"TarinPairor":{"docs":7,"functional-code":0,"test-code":0},"tamagochuuu":{"docs":260,"functional-code":0,"test-code":0}},"authorContributionVariance":{"agreatdayy":402.49692,"Wyrkx":519508.0,"TarinPairor":20.95062,"tamagochuuu":5042.283},"authorDisplayNameMap":{"agreatdayy":"CS2103T-F12-3 LEE ..YUAN","Wyrkx":"CS2103T-F12-3 CARS..E NG","TarinPairor":"CS2103T-F12-3 PAIR..ARIN","tamagochuuu":"CS2103T-F12-3 TEE .. JIE"}} +{"authorDailyContributionsMap":{"agreatdayy":[{"date":"2024-02-23","commitResults":[{"hash":"9f1a768a9e2e216bf71bac6ebf5cc41dfbd72805","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Add codecov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-06","commitResults":[{"hash":"588eaab92d71473568ca6d4101ee3c3f597e5ce6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Change project member names","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"88b201c384215cb64c537b9054ee6538f29be751","isMergeCommit":false,"messageTitle":"AboutUs.md: Update Xin Yuan\u0027s info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":12}}},{"hash":"3d40151fde0eb3b09530f20311019f45f2149608","isMergeCommit":false,"messageTitle":"AboutUs.md: Update XY\u0027s github and portfolio","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"49f14c8c7532937ece212c3b9207654c43d55e66","isMergeCommit":false,"messageTitle":"Add xinyuan.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":38,"deletions":0}}},{"hash":"f78f26f647c0a7f32e9cd07e8146546784094a91","isMergeCommit":true,"messageTitle":"Merge pull request #8 from agreatdayy/master","messageBody":"Add xinyuan.md","fileTypesAndContributionMap":{}},{"hash":"07e1e135526ef913ebee04a08addc5a191d9538f","isMergeCommit":false,"messageTitle":"AboutUs.md: Update XY\u0027s photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a538ed2003f6c58d1b191c5f02e612cee6cd036f","isMergeCommit":true,"messageTitle":"Merge pull request #13 from agreatdayy/master","messageBody":"AboutUs.md: Update XY\u0027s photo","fileTypesAndContributionMap":{}},{"hash":"42a1146949f3b56c2dc2543ec2434e08d8a05bf9","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"7e05304554f51862cb21fb75c5c28535ab377a13","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"50bdeb3fda5c74d64181044e19752c4a317d04d4","isMergeCommit":false,"messageTitle":"README.md: Fix UI photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5028c0ce33be4f2c4f2a9e6c2378714c68a168af","isMergeCommit":false,"messageTitle":"README.md: Update link to project website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2a61cde57ea47450174c6b82e5428e762bcd7390","isMergeCommit":true,"messageTitle":"Merge pull request #14 from agreatdayy/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"e43a7e87b27dd3a847fa003563a1be729e50513a","isMergeCommit":false,"messageTitle":"README.md: Acknowledge original source of code","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"581666a0fcb709919af03df7d42251f8ca4b840f","isMergeCommit":true,"messageTitle":"Merge pull request #15 from agreatdayy/master","messageBody":"Update site-wide settings","fileTypesAndContributionMap":{}},{"hash":"e25f12e9c29105f3d961d34f57ae4d23db5e5391","isMergeCommit":false,"messageTitle":"xinyuan.md: Update contents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":11}}},{"hash":"c28add549515a8535c060a1b6d91d63fb3ce0bcf","isMergeCommit":false,"messageTitle":"README.md: Update GitHub Actions build status badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"82eee209e3da3103460bcf7216a81bc3af463ec1","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"7fb75c69d798797ee63c869eeacd2c3419cfe5d5","isMergeCommit":true,"messageTitle":"Merge pull request #16 from agreatdayy/master","messageBody":"Update README.md ","fileTypesAndContributionMap":{}},{"hash":"c58719b023011b56b56d1494ee08ff8afcca45b9","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"7f7652f7ac9c166fe9fe7e3c23bfa934cd0f177e","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4c34c66bd3bbc1ab6fae57e5be84f67241fa40bf","isMergeCommit":false,"messageTitle":"index.md: Fix UI image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8fe54d3a6a584870cb62fc8c3fa48c9f5906d8c9","isMergeCommit":true,"messageTitle":"Merge pull request #17 from agreatdayy/master","messageBody":"Update project website front page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"16ff2fe2611a6cfeafa63225052dd38e73199509","isMergeCommit":false,"messageTitle":"Aboutus.md: fix carsten and tarin\u0027s image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1c21284a0903fd4cf873987317e31c7c0fc3b986","isMergeCommit":false,"messageTitle":"Fix code to pass checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":24,"deletions":24},"docs":{"insertions":46,"deletions":0}}},{"hash":"8b687dab64e7b9193c9522c83dedd53efb089b6f","isMergeCommit":true,"messageTitle":"Merge pull request #1 from agreatdayy/master","messageBody":"Fix code to pass checkstyle","fileTypesAndContributionMap":{}},{"hash":"7a4dd02344fe4b8ace8e2f8aab8c6181ae4ed3bc","isMergeCommit":false,"messageTitle":"Fix import order","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":2}}},{"hash":"8c87944e102335038fe08db10d0151dfd19affda","isMergeCommit":true,"messageTitle":"Fix import order","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"4fff740c581a464b39118f3436638d92dfe50d7b","isMergeCommit":false,"messageTitle":"Logic.java: fix import error","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":4}}},{"hash":"505801ef3ca2a900d07569c698f96e69bd5dea53","isMergeCommit":false,"messageTitle":"Logic.java: fix import error #2","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"08d1edb24ae96bdfbdea20ebc4b82b78d27879bf","isMergeCommit":false,"messageTitle":"Logic.java: fix import error #3","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"482c9a6cc5213338969e1591961f1c0776643c18","isMergeCommit":false,"messageTitle":"Update image names to github username","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":1,"deletions":1},"docs":{"insertions":4,"deletions":4},"test-code":{"insertions":362,"deletions":204}}},{"hash":"97835525c06bc077fece2cd5cb0018afa6e84f54","isMergeCommit":false,"messageTitle":"UIPartTest.java: Fix refactoring problem","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":1,"deletions":1}}},{"hash":"5c1e911d607d7d3f082e73bbfe301eb9676390f3","isMergeCommit":true,"messageTitle":"Merge pull request #23 from agreatdayy/AboutUs-images","messageBody":"Aboutus.md: fix carsten and tarin\u0027s image","fileTypesAndContributionMap":{}}]},{"date":"2024-03-12","commitResults":[{"hash":"dda668b5498c231fd4f91cc8ed86dbdf19d93f24","isMergeCommit":false,"messageTitle":"Small fix: README layout","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"f50b8c74545762040cc1a785da31eaf68375b5a4","isMergeCommit":true,"messageTitle":"Merge pull request #24 from agreatdayy/wrap-milestone-v1.1","messageBody":"Wrap milestone v1.1","tags":["v1.1"],"fileTypesAndContributionMap":{}},{"hash":"4976c0ca214f0063d6a65f0d1a02f2a02b9fb68e","isMergeCommit":false,"messageTitle":"Update xinyuan.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ea340e99ab5202e562b41805a88631f6ba6f6c42","isMergeCommit":true,"messageTitle":"Merge pull request #25 from AY2324S2-CS2103T-F12-3/tutorial-adding-command","messageBody":"Update xinyuan.md","fileTypesAndContributionMap":{}}]}],"Wyrkx":[{"date":"2024-02-24","commitResults":[{"hash":"ee1e19c316aeb35a7fcd63137c65de97f11bcf8b","isMergeCommit":true,"messageTitle":"Merge pull request #1 from agreatdayy/patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"f4eb09bc2a70b18464e8b58b541c2cdf130fea7f","isMergeCommit":true,"messageTitle":"Merge pull request #7 from agreatdayy/master","messageBody":"Update AboutUs.md Test","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"0299eebc67a1ac72a8efdc8ac4d69f3bfff2cd2d","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":37,"deletions":4}}},{"hash":"ce3e63eb43c698b577c0274c95e43b21c46d20af","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Wyrkx/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"b436614f242e5f63c2e59b71cff201b5ce51dca4","isMergeCommit":false,"messageTitle":"Cleanup docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}},{"hash":"e88c4a9102cdfb597c68db210c2b2af29401909e","isMergeCommit":true,"messageTitle":"Merge pull request #21 from Wyrkx/master","messageBody":"Cleanup docs","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"0f09475fed2d5505740a614df0a0a54be44051ac","isMergeCommit":false,"messageTitle":"Refactored packages","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":898,"deletions":891},"test-code":{"insertions":644,"deletions":717}}},{"hash":"b517f0dc1f3007967c25a246827b2e7fcb6e44a4","isMergeCommit":true,"messageTitle":"Merge pull request #22 from Wyrkx/master","messageBody":"Refactored packages","fileTypesAndContributionMap":{}}]}],"TarinPairor":[{"date":"2024-03-06","commitResults":[{"hash":"6b52012a39b39e20f52548f887552c4b2ba728af","isMergeCommit":false,"messageTitle":"AboutUs.md Update Tarin\u0027s info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":11}}}]},{"date":"2024-03-11","commitResults":[{"hash":"ed545568bf8657ef78600adfe47409c5b552afbf","isMergeCommit":false,"messageTitle":"Change Tarin image width","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-12","commitResults":[{"hash":"86fa211978e00091ea3bc27be7547750ec60efa4","isMergeCommit":false,"messageTitle":"Update tarinpairor.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":30}}},{"hash":"94b76c855a670f015f634de05cb13334cd47a80a","isMergeCommit":true,"messageTitle":"Merge pull request #26 from AY2324S2-CS2103T-F12-3/branch-change-tarin.md","messageBody":"Update tarinpairor.md","fileTypesAndContributionMap":{}}]}],"tamagochuuu":[{"date":"2024-03-06","commitResults":[{"hash":"983dad91cc06feb3f47c2466a8c605a924e04ae2","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-F12-3/master","messageBody":"Updating my fork","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"bad12b2fa08d2ef25015fbbcfc7434503d7a2b40","isMergeCommit":false,"messageTitle":"Update the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":225,"deletions":30}}},{"hash":"60f87c37998d924a801b1c959735710fd5fcace7","isMergeCommit":true,"messageTitle":"Merge pull request #2 from tamagochuuu/update-dg","messageBody":"Update the DG","fileTypesAndContributionMap":{}},{"hash":"2ef7fcdabdfe11830181a43cc1fef0e27fc5de5e","isMergeCommit":true,"messageTitle":"Merge pull request #18 from tamagochuuu/master","messageBody":"Update the DG","fileTypesAndContributionMap":{}},{"hash":"2e49212be9583f6a53f9724cd0a9eb44ed91d7e2","isMergeCommit":true,"messageTitle":"Merge pull request #3 from AY2324S2-CS2103T-F12-3/master","messageBody":"Update my fork","fileTypesAndContributionMap":{}},{"hash":"15cafe52bbee868caaebaa8801fd39d781b91f4b","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":11}}},{"hash":"41659b97c46e6f6fcbea0492c9ad3e1eafdb07b1","isMergeCommit":true,"messageTitle":"Merge pull request #4 from tamagochuuu/update-aboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"a3eaece9950c3fb5ba8b20fc21dddf8dcaaaf684","isMergeCommit":true,"messageTitle":"Merge pull request #19 from tamagochuuu/master","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"agreatdayy":{"docs":72,"functional-code":26,"test-code":352,"other":1},"Wyrkx":{"docs":39,"functional-code":337,"test-code":998},"TarinPairor":{"docs":22,"functional-code":0,"test-code":0},"tamagochuuu":{"docs":258,"functional-code":0,"test-code":0}},"authorContributionVariance":{"agreatdayy":23756.006,"Wyrkx":493754.22,"TarinPairor":124.337944,"tamagochuuu":4791.689},"authorDisplayNameMap":{"agreatdayy":"CS2103T-F12-3 LEE ..YUAN","Wyrkx":"CS2103T-F12-3 CARS..E NG","TarinPairor":"CS2103T-F12-3 PAIR..ARIN","tamagochuuu":"CS2103T-F12-3 TEE .. JIE"}} diff --git a/AY2324S2-CS2103T-T08-2_tp_master/authorship.json b/AY2324S2-CS2103T-T08-2_tp_master/authorship.json index fe7e5464..46b4eb48 100644 --- a/AY2324S2-CS2103T-T08-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T08-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"bertrandong"},"content":"## Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` is a desktop application for **managing customer information and orders**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"content":" * For homemade food sellers to keep track of customer orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"bertrandong"},"content":" * Keep records of customer information for easy reference.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` can help homemade food sellers **organize customer information and orders** so that they know **what** to bake, **how much** to bake and **where to deliver** the order to. This information management tool aims to be **more efficient to use than paper-work or general-purpose excel sheets**. We also aim to **reduce chances of mistakes** such as wrong delivery address, forgetting an order or sending repeated orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"bertrandong"},"content":"* Feature list:","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"bertrandong"},"content":" * Add new customer contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":" * Edit contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":" * Search contact based on keywords","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"bertrandong"},"content":" * Create orders, which will be tagged to the respective customer","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"bertrandong"},"content":" * Edit order information","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"bertrandong"},"content":" * List out all active orders","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"bertrandong"},"content":" * Delete order when delivery is done","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"bertrandong"},"content":"* It is named `Strack.io` because it was created to help keep track of snack orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"bertrandong"},"content":"* For the detailed documentation of this project, see the **[Strack.io Product Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"bertrandong"},"content":"**Acknowledgements**","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"bertrandong"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"bertrandong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"-":4,"bertrandong":21}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"chonghaoen"},"content":"[[Project Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)]","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"content":"## Strack.io","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"### Nigel Lim","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"nigel27022001"},"content":"\u003cimg src\u003d\"images/nigel27022001.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"chonghaoen"},"content":"[[github](https://github.com/nigel27022001)]","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/nigel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"chonghaoen"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Scheduling and tracking, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"chonghaoen"},"content":"### Joel Wang","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"Joelwang22"},"content":"\u003cimg src\u003d\"images/joelwang22.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/joelwang22)]","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/joel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"chonghaoen"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chonghaoen"},"content":"### Isaac Chong","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/chonghaoen.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/chonghaoen)] [[portfolio](team/isaac.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"chonghaoen"},"content":"### Yang Yibai","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"0-yibai"},"content":"\u003cimg src\u003d\"images/0-yibai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/0-yibai)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/yibai.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chonghaoen"},"content":"### Bertrand Ong","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"bertrandong"},"content":"\u003cimg src\u003d\"images/bertrandong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/bertrandong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/bertrand.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"nigel27022001":1,"chonghaoen":24,"0-yibai":1,"Joelwang22":1,"-":29,"bertrandong":1}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"nigel27022001"},"content":"* Home-Based Food Business Owners who sell their products online","lastModifiedDate":"2024-03-11"},{"lineNumber":266,"author":{"gitId":"nigel27022001"},"content":"* has a need to manage a significant number of customer contacts","lastModifiedDate":"2024-03-11"},{"lineNumber":267,"author":{"gitId":"nigel27022001"},"content":"* has a need to track the food order to the contact","lastModifiedDate":"2024-03-11"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":271,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"nigel27022001"},"content":"**Value proposition**: The address book can help homemade food sellers organize customer information and orders ","lastModifiedDate":"2024-03-11"},{"lineNumber":274,"author":{"gitId":"nigel27022001"},"content":"so that they know what to bake, how much to bake and where to deliver the order to. This information management ","lastModifiedDate":"2024-03-11"},{"lineNumber":275,"author":{"gitId":"nigel27022001"},"content":"tool aims to be more efficient to use than paper-work or general-purpose excel sheets. We also aim to reduce ","lastModifiedDate":"2024-03-11"},{"lineNumber":276,"author":{"gitId":"nigel27022001"},"content":"chances of mistakes such as wrong delivery address, forgetting an order or sending repeated orders.","lastModifiedDate":"2024-03-11"},{"lineNumber":277,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"0-yibai"},"content":"|----------|----------------------------|-----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | see a list of all main functionalities | know what I can do with the app |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | check the explanation of all functions | know what the commands mean |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"0-yibai"},"content":"| `* * *` | second time user | retrieve data I entered last time | |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"0-yibai"},"content":"| `* * *` | forgetful user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | add new contacts into the program | keep information of customers |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | remove contacts from the program | remove information of customers that I no longer do business with |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | find a customer by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | create orders for contacts | know what customers have purchased |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | mark an order as done | distinguish between orders done and not done yet |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"0-yibai"},"content":"| `* *` | new user | see sample data | see what the app looks like when it is in use and try out the functions hands-on |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | edit orders | update orders when customers change them |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | update the contact information | correct mistakes made by me and users when keying in information, and update when users change information |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | archive completed orders | track past orders for accounting purposes |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | mark the stage of an order | track the status of each order precisely |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"0-yibai"},"content":"| `* *` | busy seller | type the commands fast using shortcuts | save time and improve work efficiency |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller with many customers | search for users who have existing orders | better fulfill the orders |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track the number of orders each address has | double check for any discrepancies |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track which deliveries are handed by which postman | know who to approach if there is any issue |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | mark select a bunch of orders as to be delivered together in the next round | |","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | hide private contact details | minimize chance of leakage of customer information by accident |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"0-yibai"},"content":"| `*` | busy seller | get auto-suggestions as I type | type fast and work efficiently |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"0-yibai"},"content":"| `*` | seller with many customers | sort customer by name | locate a person easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | undo delete commands | recover information I accidentally deleted by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | get a double confirmation warning before I delete anything | reduce chance of deleting information by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"nigel27022001"},"content":"(For all use cases below, the **System** is the `Strack.io` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC1 - Adding a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to add a new customer and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added customer contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC2 - Delete a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the contact, displaying the deleted contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"nigel27022001"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC3 - Edit a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"nigel27022001"},"content":"3. User requests to edit the details of a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io edits the details of the person and displays the new contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"nigel27022001"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"nigel27022001"},"content":"* 3b. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"nigel27022001"},"content":" * 3b1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"nigel27022001"},"content":" * 3b2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"nigel27022001"},"content":" Steps 3b1-3b2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC4 - Searching for a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"nigel27022001"},"content":"1. User requests to search for contact based on keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of matching persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list of matching persons is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC5 - Creating an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to create an order for an existing person and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added order.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC6 - Delete an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific order in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the order, displaying the deleted order.","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"0-yibai"},"content":"2. Should be able to hold up to 10000 contacts and 500 active orders without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":455,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"0-yibai"},"content":"4. Even when the app quits unexpectedly in run time, most information updated in the current session should not be lost when the app re-launches.","lastModifiedDate":"2024-03-06"},{"lineNumber":457,"author":{"gitId":"0-yibai"},"content":"5. Should protect sensitive customer information so that they are not leaked to possible malware on the same device.","lastModifiedDate":"2024-03-06"},{"lineNumber":458,"author":{"gitId":"0-yibai"},"content":"6. The user interface should look clean and organised even when it is populated with a lot of information.","lastModifiedDate":"2024-03-06"},{"lineNumber":459,"author":{"gitId":"0-yibai"},"content":"7. The response time to any action other than fetching archived order history should be within 1 second.","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":464,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"0-yibai"},"content":"* **Sensitive customer information**: Customer\u0027s name, email, phone number, address and any other personal information which is saved locally in this app","lastModifiedDate":"2024-03-06"},{"lineNumber":466,"author":{"gitId":"0-yibai"},"content":"* **Stage of an order**: Under preparation, Ready for delivery, Sent for delivery, Received by customer(Completed)","lastModifiedDate":"2024-03-06"},{"lineNumber":467,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"nigel27022001":121,"0-yibai":32,"-":365}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":"Strack.io is a **desktop app for Homemade food sellers to manage contacts of their customers, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, Strack.io can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"Joelwang22"},"content":"Format: `edit c/CUSTOMER_ID [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2024-03-07"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"Joelwang22"},"content":"* Edits the person of the specified `CUSTOMER_ID`. The customer_id refers to the number shown in the person\u0027s contact under \"customer id\". The customer id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"Joelwang22"},"content":"* `edit c/1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the person with customer_id of 1 to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"Joelwang22"},"content":"* `edit c/2 n/Betsy Crower t/` Edits the name of the person with customer_id of 2 to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-03-07"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"Joelwang22"},"content":"Finds persons based on name, phone number or customer id.","lastModifiedDate":"2024-03-07"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"Joelwang22"},"content":"Format: `find [n/NAME] [c/CUSTOMER_ID] [p/PHONE_NUMBER]`","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"Joelwang22"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"Joelwang22"},"content":"* Persons matching at least one of the specified information will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-07"},{"lineNumber":123,"author":{"gitId":"Joelwang22"},"content":" Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":124,"author":{"gitId":"Joelwang22"},"content":"* `n/Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2024-03-07"},{"lineNumber":125,"author":{"gitId":"Joelwang22"},"content":"* `n/Hans Bo c/12` will return `Hans Bo`, as well as person with customer id `12`","lastModifiedDate":"2024-03-07"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"Joelwang22"},"content":"* `find c/John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"Joelwang22"},"content":"* `find c/alex` returns `Alex`\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"Joelwang22"},"content":" ![result for \u0027find alex\u0027](images/findAlexResult.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"Joelwang22"},"content":"* `find c/ 19` returns person with customer id of `19`","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"Joelwang22"},"content":"* `find p/85012345` returns person with phone number of `85012345`","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"Joelwang22"},"content":"Format: `delete c/CUSTOMER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"Joelwang22"},"content":"* Deletes the person of the specified `CUSTOMER_ID`.","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"Joelwang22"},"content":"* The customer_id refers to the number shown under customer id in the displayed person contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"Joelwang22"},"content":"* The customer_id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"Joelwang22"},"content":"* `list` followed by `delete c/2` deletes the person with customer_id of `2` in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"Joelwang22"},"content":"* `find Betsy` followed by `delete c/1` deletes the person with customer_id of `1` in the results of the `find` command.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":148,"author":{"gitId":"Joelwang22"},"content":"### Creating of orders : `order`","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"Joelwang22"},"content":"Assigns an order to a specified person in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"Joelwang22"},"content":"Format: `order p/PHONE_NUMBER`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"Joelwang22"},"content":"* Orders are assigned to person with specified `PHONE_NUMBER`.","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"Joelwang22"},"content":"* Strack will prompt `Input Products`.","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"Joelwang22"},"content":"* Follow up with products to be added to the order using the following format. Format: `pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`.","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"Joelwang22"},"content":"* This can be repeated as many times as necessary.","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"Joelwang22"},"content":"* When done adding products, simply type `done`,","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"Joelwang22"},"content":"* `order p/99887766` will create an order for person with phone number `99887766` followed by `pn/Cupcake pq/2` and `pn/Cookie pq/2` ending with `done` \u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"Joelwang22"},"content":"![result for creating order for alex](images/addOrderResult.png) ","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"Joelwang22"},"content":"\u003cbr\u003e![system interaction for order creation](images/systemCreateOrder.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"Joelwang22"},"content":"### Editing of orders `edit`","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"Joelwang22"},"content":"Edits an existing order of a specific person in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"Joelwang22"},"content":"Format: `edit o/ORDER_ID pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"Joelwang22"},"content":"* `ORDER_ID` is a unique number for each order.","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"Joelwang22"},"content":"* The order id refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"Joelwang22"},"content":"* Products are edited based on `PRODUCT_NAME`.","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"Joelwang22"},"content":"* To remove product from order, specify `PRODUCT_QUANTITY` as `0`.","lastModifiedDate":"2024-03-07"},{"lineNumber":175,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"Joelwang22"},"content":"* `edit o/1 pn/Chicken Pie pq/2 pn/Macaron pq/6` will edit the order with order id of 1 and change `Chiken Pie` quantity to `2` and `Macaron` quantity to `6`.","lastModifiedDate":"2024-03-07"},{"lineNumber":178,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"Joelwang22"},"content":"### Listing of orders: `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":181,"author":{"gitId":"Joelwang22"},"content":"Lists all ongoing orders in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":183,"author":{"gitId":"Joelwang22"},"content":"Format: `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"Joelwang22"},"content":"* ongoing orders will be displayed sorted by `ORDER_ID`.","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"Joelwang22"},"content":"* The order id refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"Joelwang22"},"content":"* `list orders` might display the following:","lastModifiedDate":"2024-03-07"},{"lineNumber":190,"author":{"gitId":"Joelwang22"},"content":"![result for listing orders](images/listOrderResult.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":191,"author":{"gitId":"Joelwang22"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":192,"author":{"gitId":"Joelwang22"},"content":"### Deleting of orders: `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":193,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"Joelwang22"},"content":"Deletes an ongoing order in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":195,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":196,"author":{"gitId":"Joelwang22"},"content":"Format: `delete o/ORDER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":197,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":198,"author":{"gitId":"Joelwang22"},"content":"* `ORDER_ID` refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":199,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":200,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":201,"author":{"gitId":"Joelwang22"},"content":"* `delete o/19` will delete order with `ORDER_ID` of `19`.","lastModifiedDate":"2024-03-07"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":221,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":223,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":224,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":225,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-02-09"},{"lineNumber":226,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":243,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":247,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"Joelwang22"},"content":"**Delete customer** | `delete c/CUSTOMER_ID`\u003cbr\u003e e.g., `delete c/3`","lastModifiedDate":"2024-03-07"},{"lineNumber":254,"author":{"gitId":"Joelwang22"},"content":"**Edit customer** | `edit c/CUSTOMER_ID [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2024-03-07"},{"lineNumber":255,"author":{"gitId":"Joelwang22"},"content":"**Find** | `find [n/NAME] [c/CUSTOMER_ID] [p/PHONE_NUMBER]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2024-03-07"},{"lineNumber":256,"author":{"gitId":"Joelwang22"},"content":"**List contacts** | `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":257,"author":{"gitId":"Joelwang22"},"content":"**List orders** | `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":258,"author":{"gitId":"Joelwang22"},"content":"**Create order** | `order`","lastModifiedDate":"2024-03-07"},{"lineNumber":259,"author":{"gitId":"Joelwang22"},"content":"**Delete order** | `delete o/ORDER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":260,"author":{"gitId":"Joelwang22"},"content":"**Edit order** | `edit o/ORDER_ID pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`","lastModifiedDate":"2024-03-07"},{"lineNumber":261,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Joelwang22":83,"-":178}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"bertrandong"},"content":"title: Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"bertrandong"},"content":"**Strack.io is a desktop application for managing customer information and orders.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":"* If you are interested in using Strack.io, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":"* If you are interested about developing Strack.io, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"bertrandong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"-":14,"bertrandong":6}},{"path":"docs/team/bertrand.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"bertrandong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"bertrandong"},"content":"title: Bertrand\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"bertrandong":10}},{"path":"docs/team/isaac.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"title: Isaac\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"chonghaoen"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"chonghaoen":10}},{"path":"docs/team/joel.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Joelwang22"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Joelwang22"},"content":"title: Joel\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Joelwang22"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Joelwang22"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Joelwang22":10}},{"path":"docs/team/nigel.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nigel27022001"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"nigel27022001"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"nigel27022001"},"content":"title: Nigel\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"nigel27022001"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"nigel27022001"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"nigel27022001"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"nigel27022001"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"nigel27022001"},"content":"1. Use Cases in the Project Developer Guide.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"nigel27022001":11}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"chonghaoen"},"content":" public static final Prefix PREFIX_ORDER \u003d new Prefix(\"o/\");","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"chonghaoen"},"content":" public static final Prefix PREFIX_PRODUCT_NAME \u003d new Prefix(\"pn/\");","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"chonghaoen"},"content":" public static final Prefix PREFIX_PRODUCT_QUANTITY \u003d new Prefix(\"pq\");","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"chonghaoen":3,"-":15}},{"path":"src/main/java/seedu/address/model/exceptions/OrderNotFoundException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"public class OrderNotFoundException {","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4}},{"path":"src/main/java/seedu/address/model/order/Order.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.order;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"public class Order {","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4}},{"path":"src/main/java/seedu/address/model/order/OrderList.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.order;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"public class OrderList {","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4}},{"path":"src/main/java/seedu/address/model/order/Product.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.order;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"public class Product {","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"bertrandong"},"content":"## Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` is a desktop application for **managing customer information and orders**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"content":" * For homemade food sellers to keep track of customer orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"bertrandong"},"content":" * Keep records of customer information for easy reference.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` can help homemade food sellers **organize customer information and orders** so that they know **what** to bake, **how much** to bake and **where to deliver** the order to. This information management tool aims to be **more efficient to use than paper-work or general-purpose excel sheets**. We also aim to **reduce chances of mistakes** such as wrong delivery address, forgetting an order or sending repeated orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"bertrandong"},"content":"* Feature list:","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"bertrandong"},"content":" * Add new customer contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":" * Edit contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":" * Search contact based on keywords","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"bertrandong"},"content":" * Create orders, which will be tagged to the respective customer","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"bertrandong"},"content":" * Edit order information","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"bertrandong"},"content":" * List out all active orders","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"bertrandong"},"content":" * Delete order when delivery is done","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"bertrandong"},"content":"* It is named `Strack.io` because it was created to help keep track of snack orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"bertrandong"},"content":"* For the detailed documentation of this project, see the **[Strack.io Product Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"bertrandong"},"content":"**Acknowledgements**","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"bertrandong"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"bertrandong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"-":4,"bertrandong":21}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"chonghaoen"},"content":"[[Project Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)]","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"content":"## Strack.io","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"### Nigel Lim","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"nigel27022001"},"content":"\u003cimg src\u003d\"images/nigel27022001.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"chonghaoen"},"content":"[[github](https://github.com/nigel27022001)]","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/nigel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"chonghaoen"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Scheduling and tracking, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"chonghaoen"},"content":"### Joel Wang","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"Joelwang22"},"content":"\u003cimg src\u003d\"images/joelwang22.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/joelwang22)]","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/joel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"chonghaoen"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chonghaoen"},"content":"### Isaac Chong","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/chonghaoen.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/chonghaoen)] [[portfolio](team/isaac.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"chonghaoen"},"content":"### Yang Yibai","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"0-yibai"},"content":"\u003cimg src\u003d\"images/0-yibai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/0-yibai)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/yibai.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chonghaoen"},"content":"### Bertrand Ong","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"bertrandong"},"content":"\u003cimg src\u003d\"images/bertrandong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/bertrandong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/bertrand.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"nigel27022001":1,"chonghaoen":24,"0-yibai":1,"Joelwang22":1,"-":29,"bertrandong":1}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"nigel27022001"},"content":"* Home-Based Food Business Owners who sell their products online","lastModifiedDate":"2024-03-11"},{"lineNumber":266,"author":{"gitId":"nigel27022001"},"content":"* has a need to manage a significant number of customer contacts","lastModifiedDate":"2024-03-11"},{"lineNumber":267,"author":{"gitId":"nigel27022001"},"content":"* has a need to track the food order to the contact","lastModifiedDate":"2024-03-11"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":271,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"nigel27022001"},"content":"**Value proposition**: The address book can help homemade food sellers organize customer information and orders ","lastModifiedDate":"2024-03-11"},{"lineNumber":274,"author":{"gitId":"nigel27022001"},"content":"so that they know what to bake, how much to bake and where to deliver the order to. This information management ","lastModifiedDate":"2024-03-11"},{"lineNumber":275,"author":{"gitId":"nigel27022001"},"content":"tool aims to be more efficient to use than paper-work or general-purpose excel sheets. We also aim to reduce ","lastModifiedDate":"2024-03-11"},{"lineNumber":276,"author":{"gitId":"nigel27022001"},"content":"chances of mistakes such as wrong delivery address, forgetting an order or sending repeated orders.","lastModifiedDate":"2024-03-11"},{"lineNumber":277,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"0-yibai"},"content":"|----------|----------------------------|-----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | see a list of all main functionalities | know what I can do with the app |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | check the explanation of all functions | know what the commands mean |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"0-yibai"},"content":"| `* * *` | second time user | retrieve data I entered last time | |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"0-yibai"},"content":"| `* * *` | forgetful user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | add new contacts into the program | keep information of customers |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | remove contacts from the program | remove information of customers that I no longer do business with |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | find a customer by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | create orders for contacts | know what customers have purchased |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | mark an order as done | distinguish between orders done and not done yet |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"0-yibai"},"content":"| `* *` | new user | see sample data | see what the app looks like when it is in use and try out the functions hands-on |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | edit orders | update orders when customers change them |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | update the contact information | correct mistakes made by me and users when keying in information, and update when users change information |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | archive completed orders | track past orders for accounting purposes |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | mark the stage of an order | track the status of each order precisely |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"0-yibai"},"content":"| `* *` | busy seller | type the commands fast using shortcuts | save time and improve work efficiency |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller with many customers | search for users who have existing orders | better fulfill the orders |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track the number of orders each address has | double check for any discrepancies |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track which deliveries are handed by which postman | know who to approach if there is any issue |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | mark select a bunch of orders as to be delivered together in the next round | |","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | hide private contact details | minimize chance of leakage of customer information by accident |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"0-yibai"},"content":"| `*` | busy seller | get auto-suggestions as I type | type fast and work efficiently |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"0-yibai"},"content":"| `*` | seller with many customers | sort customer by name | locate a person easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | undo delete commands | recover information I accidentally deleted by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | get a double confirmation warning before I delete anything | reduce chance of deleting information by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"nigel27022001"},"content":"(For all use cases below, the **System** is the `Strack.io` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC1 - Adding a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to add a new customer and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added customer contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC2 - Delete a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the contact, displaying the deleted contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"nigel27022001"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC3 - Edit a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"nigel27022001"},"content":"3. User requests to edit the details of a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io edits the details of the person and displays the new contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"nigel27022001"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"nigel27022001"},"content":"* 3b. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"nigel27022001"},"content":" * 3b1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"nigel27022001"},"content":" * 3b2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"nigel27022001"},"content":" Steps 3b1-3b2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC4 - Searching for a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"nigel27022001"},"content":"1. User requests to search for contact based on keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of matching persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list of matching persons is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC5 - Creating an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to create an order for an existing person and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added order.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC6 - Delete an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific order in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the order, displaying the deleted order.","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"0-yibai"},"content":"2. Should be able to hold up to 10000 contacts and 500 active orders without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":455,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"0-yibai"},"content":"4. Even when the app quits unexpectedly in run time, most information updated in the current session should not be lost when the app re-launches.","lastModifiedDate":"2024-03-06"},{"lineNumber":457,"author":{"gitId":"0-yibai"},"content":"5. Should protect sensitive customer information so that they are not leaked to possible malware on the same device.","lastModifiedDate":"2024-03-06"},{"lineNumber":458,"author":{"gitId":"0-yibai"},"content":"6. The user interface should look clean and organised even when it is populated with a lot of information.","lastModifiedDate":"2024-03-06"},{"lineNumber":459,"author":{"gitId":"0-yibai"},"content":"7. The response time to any action other than fetching archived order history should be within 1 second.","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":464,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"0-yibai"},"content":"* **Sensitive customer information**: Customer\u0027s name, email, phone number, address and any other personal information which is saved locally in this app","lastModifiedDate":"2024-03-06"},{"lineNumber":466,"author":{"gitId":"0-yibai"},"content":"* **Stage of an order**: Under preparation, Ready for delivery, Sent for delivery, Received by customer(Completed)","lastModifiedDate":"2024-03-06"},{"lineNumber":467,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"nigel27022001":121,"0-yibai":32,"-":365}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":"Strack.io is a **desktop app for Homemade food sellers to manage contacts of their customers, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, Strack.io can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"Joelwang22"},"content":"Format: `edit c/CUSTOMER_ID [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2024-03-07"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"Joelwang22"},"content":"* Edits the person of the specified `CUSTOMER_ID`. The customer_id refers to the number shown in the person\u0027s contact under \"customer id\". The customer id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"Joelwang22"},"content":"* `edit c/1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the person with customer_id of 1 to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"Joelwang22"},"content":"* `edit c/2 n/Betsy Crower t/` Edits the name of the person with customer_id of 2 to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-03-07"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"Joelwang22"},"content":"Finds persons based on name, phone number or customer id.","lastModifiedDate":"2024-03-07"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"Joelwang22"},"content":"Format: `find [n/NAME] [c/CUSTOMER_ID] [p/PHONE_NUMBER]`","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"Joelwang22"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"Joelwang22"},"content":"* Persons matching at least one of the specified information will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-07"},{"lineNumber":123,"author":{"gitId":"Joelwang22"},"content":" Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":124,"author":{"gitId":"Joelwang22"},"content":"* `n/Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2024-03-07"},{"lineNumber":125,"author":{"gitId":"Joelwang22"},"content":"* `n/Hans Bo c/12` will return `Hans Bo`, as well as person with customer id `12`","lastModifiedDate":"2024-03-07"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"Joelwang22"},"content":"* `find c/John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"Joelwang22"},"content":"* `find c/alex` returns `Alex`\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"Joelwang22"},"content":" ![result for \u0027find alex\u0027](images/findAlexResult.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"Joelwang22"},"content":"* `find c/ 19` returns person with customer id of `19`","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"Joelwang22"},"content":"* `find p/85012345` returns person with phone number of `85012345`","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"Joelwang22"},"content":"Format: `delete c/CUSTOMER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"Joelwang22"},"content":"* Deletes the person of the specified `CUSTOMER_ID`.","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"Joelwang22"},"content":"* The customer_id refers to the number shown under customer id in the displayed person contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"Joelwang22"},"content":"* The customer_id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"Joelwang22"},"content":"* `list` followed by `delete c/2` deletes the person with customer_id of `2` in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"Joelwang22"},"content":"* `find Betsy` followed by `delete c/1` deletes the person with customer_id of `1` in the results of the `find` command.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":148,"author":{"gitId":"Joelwang22"},"content":"### Creating of orders : `order`","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"Joelwang22"},"content":"Assigns an order to a specified person in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"Joelwang22"},"content":"Format: `order p/PHONE_NUMBER`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"Joelwang22"},"content":"* Orders are assigned to person with specified `PHONE_NUMBER`.","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"Joelwang22"},"content":"* Strack will prompt `Input Products`.","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"Joelwang22"},"content":"* Follow up with products to be added to the order using the following format. Format: `pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`.","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"Joelwang22"},"content":"* This can be repeated as many times as necessary.","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"Joelwang22"},"content":"* When done adding products, simply type `done`,","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"Joelwang22"},"content":"* `order p/99887766` will create an order for person with phone number `99887766` followed by `pn/Cupcake pq/2` and `pn/Cookie pq/2` ending with `done` \u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"Joelwang22"},"content":"![result for creating order for alex](images/addOrderResult.png) ","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"Joelwang22"},"content":"\u003cbr\u003e![system interaction for order creation](images/systemCreateOrder.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"Joelwang22"},"content":"### Editing of orders `edit`","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"Joelwang22"},"content":"Edits an existing order of a specific person in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"Joelwang22"},"content":"Format: `edit o/ORDER_ID pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"Joelwang22"},"content":"* `ORDER_ID` is a unique number for each order.","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"Joelwang22"},"content":"* The order id refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"Joelwang22"},"content":"* Products are edited based on `PRODUCT_NAME`.","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"Joelwang22"},"content":"* To remove product from order, specify `PRODUCT_QUANTITY` as `0`.","lastModifiedDate":"2024-03-07"},{"lineNumber":175,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"Joelwang22"},"content":"* `edit o/1 pn/Chicken Pie pq/2 pn/Macaron pq/6` will edit the order with order id of 1 and change `Chiken Pie` quantity to `2` and `Macaron` quantity to `6`.","lastModifiedDate":"2024-03-07"},{"lineNumber":178,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"Joelwang22"},"content":"### Listing of orders: `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":181,"author":{"gitId":"Joelwang22"},"content":"Lists all ongoing orders in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":183,"author":{"gitId":"Joelwang22"},"content":"Format: `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"Joelwang22"},"content":"* ongoing orders will be displayed sorted by `ORDER_ID`.","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"Joelwang22"},"content":"* The order id refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"Joelwang22"},"content":"* `list orders` might display the following:","lastModifiedDate":"2024-03-07"},{"lineNumber":190,"author":{"gitId":"Joelwang22"},"content":"![result for listing orders](images/listOrderResult.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":191,"author":{"gitId":"Joelwang22"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":192,"author":{"gitId":"Joelwang22"},"content":"### Deleting of orders: `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":193,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"Joelwang22"},"content":"Deletes an ongoing order in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":195,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":196,"author":{"gitId":"Joelwang22"},"content":"Format: `delete o/ORDER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":197,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":198,"author":{"gitId":"Joelwang22"},"content":"* `ORDER_ID` refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":199,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":200,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":201,"author":{"gitId":"Joelwang22"},"content":"* `delete o/19` will delete order with `ORDER_ID` of `19`.","lastModifiedDate":"2024-03-07"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":221,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":223,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":224,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":225,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-02-09"},{"lineNumber":226,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":243,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":247,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"Joelwang22"},"content":"**Delete customer** | `delete c/CUSTOMER_ID`\u003cbr\u003e e.g., `delete c/3`","lastModifiedDate":"2024-03-07"},{"lineNumber":254,"author":{"gitId":"Joelwang22"},"content":"**Edit customer** | `edit c/CUSTOMER_ID [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2024-03-07"},{"lineNumber":255,"author":{"gitId":"Joelwang22"},"content":"**Find** | `find [n/NAME] [c/CUSTOMER_ID] [p/PHONE_NUMBER]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2024-03-07"},{"lineNumber":256,"author":{"gitId":"Joelwang22"},"content":"**List contacts** | `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":257,"author":{"gitId":"Joelwang22"},"content":"**List orders** | `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":258,"author":{"gitId":"Joelwang22"},"content":"**Create order** | `order`","lastModifiedDate":"2024-03-07"},{"lineNumber":259,"author":{"gitId":"Joelwang22"},"content":"**Delete order** | `delete o/ORDER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":260,"author":{"gitId":"Joelwang22"},"content":"**Edit order** | `edit o/ORDER_ID pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`","lastModifiedDate":"2024-03-07"},{"lineNumber":261,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Joelwang22":83,"-":178}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"bertrandong"},"content":"title: Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"bertrandong"},"content":"**Strack.io is a desktop application for managing customer information and orders.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":"* If you are interested in using Strack.io, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":"* If you are interested about developing Strack.io, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"bertrandong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"-":14,"bertrandong":6}},{"path":"docs/team/bertrand.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"bertrandong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"bertrandong"},"content":"title: Bertrand\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"bertrandong":10}},{"path":"docs/team/isaac.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"title: Isaac\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"chonghaoen"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"chonghaoen":10}},{"path":"docs/team/joel.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Joelwang22"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Joelwang22"},"content":"title: Joel\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Joelwang22"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Joelwang22"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Joelwang22":10}},{"path":"docs/team/nigel.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nigel27022001"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"nigel27022001"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"nigel27022001"},"content":"title: Nigel\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"nigel27022001"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"nigel27022001"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"nigel27022001"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"nigel27022001"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"nigel27022001"},"content":"1. Use Cases in the Project Developer Guide.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"nigel27022001":11}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"chonghaoen"},"content":" public static final Prefix PREFIX_ORDER \u003d new Prefix(\"o/\");","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"chonghaoen"},"content":" public static final Prefix PREFIX_PRODUCT_NAME \u003d new Prefix(\"pn/\");","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"chonghaoen"},"content":" public static final Prefix PREFIX_PRODUCT_QUANTITY \u003d new Prefix(\"pq\");","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"chonghaoen":3,"-":15}},{"path":"src/main/java/seedu/address/model/exceptions/OrderNotFoundException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.exceptions;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"public class OrderNotFoundException {","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4}},{"path":"src/main/java/seedu/address/model/order/Order.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.order;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"Joelwang22"},"content":"import java.util.HashMap;","lastModifiedDate":"2024-03-12"},{"lineNumber":4,"author":{"gitId":"Joelwang22"},"content":"import java.util.Map;","lastModifiedDate":"2024-03-12"},{"lineNumber":5,"author":{"gitId":"Joelwang22"},"content":"import java.util.Objects;","lastModifiedDate":"2024-03-12"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":7,"author":{"gitId":"chonghaoen"},"content":"public class Order {","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"Joelwang22"},"content":" private int id;","lastModifiedDate":"2024-03-12"},{"lineNumber":9,"author":{"gitId":"Joelwang22"},"content":" private Map\u003cProduct, Quantity\u003e productMap;","lastModifiedDate":"2024-03-12"},{"lineNumber":10,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":11,"author":{"gitId":"Joelwang22"},"content":" public Order() {","lastModifiedDate":"2024-03-12"},{"lineNumber":12,"author":{"gitId":"Joelwang22"},"content":" productMap \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2024-03-12"},{"lineNumber":13,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":14,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":15,"author":{"gitId":"Joelwang22"},"content":" public Order(int id) {","lastModifiedDate":"2024-03-12"},{"lineNumber":16,"author":{"gitId":"Joelwang22"},"content":" this.id \u003d id;","lastModifiedDate":"2024-03-12"},{"lineNumber":17,"author":{"gitId":"Joelwang22"},"content":" productMap \u003d new HashMap\u003c\u003e();","lastModifiedDate":"2024-03-12"},{"lineNumber":18,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":19,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":20,"author":{"gitId":"Joelwang22"},"content":" public void setID(int id) {","lastModifiedDate":"2024-03-12"},{"lineNumber":21,"author":{"gitId":"Joelwang22"},"content":" this.id \u003d id;","lastModifiedDate":"2024-03-12"},{"lineNumber":22,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":23,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":24,"author":{"gitId":"Joelwang22"},"content":" public int getId(){","lastModifiedDate":"2024-03-12"},{"lineNumber":25,"author":{"gitId":"Joelwang22"},"content":" return this.id;","lastModifiedDate":"2024-03-12"},{"lineNumber":26,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":27,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":28,"author":{"gitId":"Joelwang22"},"content":" public Map\u003cProduct, Quantity\u003e getProductMap() {","lastModifiedDate":"2024-03-12"},{"lineNumber":29,"author":{"gitId":"Joelwang22"},"content":" return this.productMap;","lastModifiedDate":"2024-03-12"},{"lineNumber":30,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":31,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":32,"author":{"gitId":"Joelwang22"},"content":" public void addProduct(Product newProduct, Quantity newQuantity) {","lastModifiedDate":"2024-03-12"},{"lineNumber":33,"author":{"gitId":"Joelwang22"},"content":" productMap.put(newProduct, newQuantity);","lastModifiedDate":"2024-03-12"},{"lineNumber":34,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":35,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":36,"author":{"gitId":"Joelwang22"},"content":" public Quantity getQuantity(Product product) {","lastModifiedDate":"2024-03-12"},{"lineNumber":37,"author":{"gitId":"Joelwang22"},"content":" Quantity currQuantity \u003d productMap.get(product);","lastModifiedDate":"2024-03-12"},{"lineNumber":38,"author":{"gitId":"Joelwang22"},"content":" return currQuantity;","lastModifiedDate":"2024-03-12"},{"lineNumber":39,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":40,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":41,"author":{"gitId":"Joelwang22"},"content":" public int getQuantityValue(Product product) {","lastModifiedDate":"2024-03-12"},{"lineNumber":42,"author":{"gitId":"Joelwang22"},"content":" int value \u003d productMap.get(product).getValue();","lastModifiedDate":"2024-03-12"},{"lineNumber":43,"author":{"gitId":"Joelwang22"},"content":" return value;","lastModifiedDate":"2024-03-12"},{"lineNumber":44,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":45,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":46,"author":{"gitId":"Joelwang22"},"content":" public void changeQuantity(Product currProduct, int newQuantity) {","lastModifiedDate":"2024-03-12"},{"lineNumber":47,"author":{"gitId":"Joelwang22"},"content":" Quantity currQuantity \u003d productMap.get(currProduct);","lastModifiedDate":"2024-03-12"},{"lineNumber":48,"author":{"gitId":"Joelwang22"},"content":" currQuantity.setQuantity(newQuantity);","lastModifiedDate":"2024-03-12"},{"lineNumber":49,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":50,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":51,"author":{"gitId":"Joelwang22"},"content":" public void deleteProduct(Product product) {","lastModifiedDate":"2024-03-12"},{"lineNumber":52,"author":{"gitId":"Joelwang22"},"content":" productMap.remove(product);","lastModifiedDate":"2024-03-12"},{"lineNumber":53,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":54,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":55,"author":{"gitId":"Joelwang22"},"content":" public void clearProductMap() {","lastModifiedDate":"2024-03-12"},{"lineNumber":56,"author":{"gitId":"Joelwang22"},"content":" this.productMap.clear();","lastModifiedDate":"2024-03-12"},{"lineNumber":57,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":58,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":59,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":60,"author":{"gitId":"Joelwang22"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-12"},{"lineNumber":61,"author":{"gitId":"Joelwang22"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-12"},{"lineNumber":62,"author":{"gitId":"Joelwang22"},"content":" return true;","lastModifiedDate":"2024-03-12"},{"lineNumber":63,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":64,"author":{"gitId":"Joelwang22"},"content":" if (!(other instanceof Order)) {","lastModifiedDate":"2024-03-12"},{"lineNumber":65,"author":{"gitId":"Joelwang22"},"content":" return false;","lastModifiedDate":"2024-03-12"},{"lineNumber":66,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":67,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":68,"author":{"gitId":"Joelwang22"},"content":" Order otherOrder \u003d (Order) other;","lastModifiedDate":"2024-03-12"},{"lineNumber":69,"author":{"gitId":"Joelwang22"},"content":" return (this.id \u003d\u003d otherOrder.id)","lastModifiedDate":"2024-03-12"},{"lineNumber":70,"author":{"gitId":"Joelwang22"},"content":" \u0026\u0026 this.productMap.equals(otherOrder.productMap);","lastModifiedDate":"2024-03-12"},{"lineNumber":71,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":72,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":73,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":74,"author":{"gitId":"Joelwang22"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-12"},{"lineNumber":75,"author":{"gitId":"Joelwang22"},"content":" return Objects.hash(id, productMap);","lastModifiedDate":"2024-03-12"},{"lineNumber":76,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":77,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":78,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":79,"author":{"gitId":"Joelwang22"},"content":" public String toString() {","lastModifiedDate":"2024-03-12"},{"lineNumber":80,"author":{"gitId":"Joelwang22"},"content":" return productMap.toString();","lastModifiedDate":"2024-03-12"},{"lineNumber":81,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":82,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4,"Joelwang22":78}},{"path":"src/main/java/seedu/address/model/order/OrderList.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.order;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"public class OrderList {","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4}},{"path":"src/main/java/seedu/address/model/order/Product.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"package seedu.address.model.order;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"public class Product {","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":5,"author":{"gitId":"Joelwang22"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-12"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":" \"Product names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-03-12"},{"lineNumber":7,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":8,"author":{"gitId":"Joelwang22"},"content":" /*","lastModifiedDate":"2024-03-12"},{"lineNumber":9,"author":{"gitId":"Joelwang22"},"content":" * The first character of the product name must not be a whitespace,","lastModifiedDate":"2024-03-12"},{"lineNumber":10,"author":{"gitId":"Joelwang22"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-03-12"},{"lineNumber":11,"author":{"gitId":"Joelwang22"},"content":" */","lastModifiedDate":"2024-03-12"},{"lineNumber":12,"author":{"gitId":"Joelwang22"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-03-12"},{"lineNumber":13,"author":{"gitId":"Joelwang22"},"content":" private String name;","lastModifiedDate":"2024-03-12"},{"lineNumber":14,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":15,"author":{"gitId":"Joelwang22"},"content":" public Product(String name) {","lastModifiedDate":"2024-03-12"},{"lineNumber":16,"author":{"gitId":"Joelwang22"},"content":" this.name \u003d name;","lastModifiedDate":"2024-03-12"},{"lineNumber":17,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":18,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":19,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":20,"author":{"gitId":"Joelwang22"},"content":" public String toString() {","lastModifiedDate":"2024-03-12"},{"lineNumber":21,"author":{"gitId":"Joelwang22"},"content":" return this.name;","lastModifiedDate":"2024-03-12"},{"lineNumber":22,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":23,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":24,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":25,"author":{"gitId":"Joelwang22"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-12"},{"lineNumber":26,"author":{"gitId":"Joelwang22"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-12"},{"lineNumber":27,"author":{"gitId":"Joelwang22"},"content":" return true;","lastModifiedDate":"2024-03-12"},{"lineNumber":28,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":29,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":30,"author":{"gitId":"Joelwang22"},"content":" if (!(other instanceof Product)){","lastModifiedDate":"2024-03-12"},{"lineNumber":31,"author":{"gitId":"Joelwang22"},"content":" return false;","lastModifiedDate":"2024-03-12"},{"lineNumber":32,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":33,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":34,"author":{"gitId":"Joelwang22"},"content":" Product otherProduct \u003d (Product) other;","lastModifiedDate":"2024-03-12"},{"lineNumber":35,"author":{"gitId":"Joelwang22"},"content":" return this.name.equals(otherProduct.name);","lastModifiedDate":"2024-03-12"},{"lineNumber":36,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":37,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":38,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":39,"author":{"gitId":"Joelwang22"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-12"},{"lineNumber":40,"author":{"gitId":"Joelwang22"},"content":" return this.name.hashCode();","lastModifiedDate":"2024-03-12"},{"lineNumber":41,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":42,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":43,"author":{"gitId":"Joelwang22"},"content":" public String getName() {","lastModifiedDate":"2024-03-12"},{"lineNumber":44,"author":{"gitId":"Joelwang22"},"content":" return this.name;","lastModifiedDate":"2024-03-12"},{"lineNumber":45,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":46,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":47,"author":{"gitId":"Joelwang22"},"content":" public void rename(String newName) {","lastModifiedDate":"2024-03-12"},{"lineNumber":48,"author":{"gitId":"Joelwang22"},"content":" this.name \u003d newName;","lastModifiedDate":"2024-03-12"},{"lineNumber":49,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":50,"author":{"gitId":"chonghaoen"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"chonghaoen":4,"Joelwang22":46}},{"path":"src/main/java/seedu/address/model/order/Quantity.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"Joelwang22"},"content":"package seedu.address.model.order;","lastModifiedDate":"2024-03-12"},{"lineNumber":2,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":3,"author":{"gitId":"Joelwang22"},"content":"public class Quantity {","lastModifiedDate":"2024-03-12"},{"lineNumber":4,"author":{"gitId":"Joelwang22"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-12"},{"lineNumber":5,"author":{"gitId":"Joelwang22"},"content":" \"Product quantity should only be a number.\";","lastModifiedDate":"2024-03-12"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\d\";","lastModifiedDate":"2024-03-12"},{"lineNumber":7,"author":{"gitId":"Joelwang22"},"content":" public int value;","lastModifiedDate":"2024-03-12"},{"lineNumber":8,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":9,"author":{"gitId":"Joelwang22"},"content":" public Quantity(int value) {","lastModifiedDate":"2024-03-12"},{"lineNumber":10,"author":{"gitId":"Joelwang22"},"content":" this.value \u003d value;","lastModifiedDate":"2024-03-12"},{"lineNumber":11,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":12,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":13,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":14,"author":{"gitId":"Joelwang22"},"content":" public String toString() {","lastModifiedDate":"2024-03-12"},{"lineNumber":15,"author":{"gitId":"Joelwang22"},"content":" return Integer.toString(this.value);","lastModifiedDate":"2024-03-12"},{"lineNumber":16,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":17,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":18,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":19,"author":{"gitId":"Joelwang22"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-12"},{"lineNumber":20,"author":{"gitId":"Joelwang22"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-12"},{"lineNumber":21,"author":{"gitId":"Joelwang22"},"content":" return true;","lastModifiedDate":"2024-03-12"},{"lineNumber":22,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":23,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":24,"author":{"gitId":"Joelwang22"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-12"},{"lineNumber":25,"author":{"gitId":"Joelwang22"},"content":" if (!(other instanceof Quantity)) {","lastModifiedDate":"2024-03-12"},{"lineNumber":26,"author":{"gitId":"Joelwang22"},"content":" return false;","lastModifiedDate":"2024-03-12"},{"lineNumber":27,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":28,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":29,"author":{"gitId":"Joelwang22"},"content":" Quantity otherQuantity \u003d (Quantity) other;","lastModifiedDate":"2024-03-12"},{"lineNumber":30,"author":{"gitId":"Joelwang22"},"content":" return this.value \u003d\u003d otherQuantity.value;","lastModifiedDate":"2024-03-12"},{"lineNumber":31,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":32,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":33,"author":{"gitId":"Joelwang22"},"content":" @Override","lastModifiedDate":"2024-03-12"},{"lineNumber":34,"author":{"gitId":"Joelwang22"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-12"},{"lineNumber":35,"author":{"gitId":"Joelwang22"},"content":" return Integer.hashCode(this.value);","lastModifiedDate":"2024-03-12"},{"lineNumber":36,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":37,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":38,"author":{"gitId":"Joelwang22"},"content":" public int getValue() {","lastModifiedDate":"2024-03-12"},{"lineNumber":39,"author":{"gitId":"Joelwang22"},"content":" return this.value;","lastModifiedDate":"2024-03-12"},{"lineNumber":40,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":41,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":42,"author":{"gitId":"Joelwang22"},"content":" public void setQuantity(int newQuantity) {","lastModifiedDate":"2024-03-12"},{"lineNumber":43,"author":{"gitId":"Joelwang22"},"content":" this.value \u003d newQuantity;","lastModifiedDate":"2024-03-12"},{"lineNumber":44,"author":{"gitId":"Joelwang22"},"content":" }","lastModifiedDate":"2024-03-12"},{"lineNumber":45,"author":{"gitId":"Joelwang22"},"content":"}","lastModifiedDate":"2024-03-12"}],"authorContributionMap":{"Joelwang22":45}}] diff --git a/AY2324S2-CS2103T-T08-2_tp_master/commits.json b/AY2324S2-CS2103T-T08-2_tp_master/commits.json index ae729916..e27906f8 100644 --- a/AY2324S2-CS2103T-T08-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T08-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"nigel27022001":[{"date":"2024-03-06","commitResults":[{"hash":"a3f2efb36fae29426785f1d92b7f5bdc1d3e320c","isMergeCommit":false,"messageTitle":"Add Use Cases to Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":117,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c88c0dccf094a9a38c3c3f703c6412e4112c57da","isMergeCommit":false,"messageTitle":"Fix Style Check Mistakes in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"9392adf069991ed83df521e384a452b9e5641771","isMergeCommit":false,"messageTitle":"Fix Readme.md stylecheck","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"98981b1b46aef54015ab4c2e51917fc9786c7582","isMergeCommit":true,"messageTitle":"Merge pull request #12 from 0-yibai/yibai/update-DG","messageBody":"Add user stories, NFR, glossary to developer guide","fileTypesAndContributionMap":{}},{"hash":"88ec1e05df514261102dfee4c5562885d235bd4b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of github.com:nigel27022001/tp into branch-DeveloperGuide","messageBody":"# Conflicts:\n#\tREADME.md\n","fileTypesAndContributionMap":{}},{"hash":"a159766918130480cd19f897782910f9226f46ed","isMergeCommit":false,"messageTitle":"Add nigel.md file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":0}}},{"hash":"ef0ca2465276d9c2938e106c80d485519938847b","isMergeCommit":true,"messageTitle":"Merge pull request #19 from nigel27022001/branch-Nigel-Info","messageBody":"Add nigel.md file","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"cdc939ff07876774a83e624327fbc8c85f6856e8","isMergeCommit":false,"messageTitle":"Fix nigel27022001.png","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1decddb87e357f97ec1143fa1b2de266b4593d83","isMergeCommit":true,"messageTitle":"Merge pull request #22 from nigel27022001/branch-png-fix","messageBody":"Fix nigel27022001.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"fff298a7c88b96caf47622b314712f5b2d446e73","isMergeCommit":false,"messageTitle":"Updated config.yml and DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":2}}},{"hash":"0779ce634007f1b321a2979a85d6de651cf6d390","isMergeCommit":true,"messageTitle":"Merge pull request #27 from nigel27022001/branch-fix-DG-and-config","messageBody":"Updated config.yml and DG","fileTypesAndContributionMap":{}}]}],"chonghaoen":[{"date":"2024-03-05","commitResults":[{"hash":"14870afb017e2eed2057ce3eb7976057cf246b02","isMergeCommit":false,"messageTitle":"Add Isaac info to team","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"5861bb187f7105d4e745a9e2fa2e00aa6885d083","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/chonghaoen/tp","messageBody":"* \u0027master\u0027 of https://github.com/chonghaoen/tp:\n Fix Readme.md stylecheck\n Fix Style Check Mistakes in DeveloperGuide.md\n Add new line to end README for CI\n Add user stories, NFR, glossary to developer guide\n Add Use Cases to Developer Guide\n Update Readme\n","fileTypesAndContributionMap":{}},{"hash":"4bbbc8e21ae1caac7f0d1abd3429b508c801d911","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a2ddcbf5d586723e6390ca63733424676163515f","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":30}}},{"hash":"17e4abb7033389c5632174c827518b6e040d4dba","isMergeCommit":true,"messageTitle":"Merge pull request #15 from chonghaoen/update-aboutus","messageBody":"Update aboutus","fileTypesAndContributionMap":{}},{"hash":"d8fbe816c10a2dc73b93881f52a7d76a3d1d8e50","isMergeCommit":false,"messageTitle":"Fix style of isaac.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0579236cd360d2d091c2946f5a8df9ad4e5c0a63","isMergeCommit":true,"messageTitle":"Merge pull request #8 from chonghaoen/add-isaac-info","messageBody":"Add Isaac info to team","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"6252eec9792750f8e531d8707362426c2f773123","isMergeCommit":false,"messageTitle":"Change Isaac Image to PNG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"510a2ba91402e18725c605756469bd85495397a4","isMergeCommit":true,"messageTitle":"Merge pull request #21 from chonghaoen/fix-image","messageBody":"Change Isaac Image to PNG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"05657ce51273e4df4ef09282625c60a2dcad185f","isMergeCommit":false,"messageTitle":"Add base order classes","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":19,"deletions":0}}},{"hash":"d20b1474b587a0733b5872f50d1c3829493d5446","isMergeCommit":true,"messageTitle":"Merge pull request #36 from chonghaoen/add-base-order","messageBody":"Add base order classes","fileTypesAndContributionMap":{}}]}],"0-yibai":[{"date":"2024-03-06","commitResults":[{"hash":"8739bdf08fe38755088d813c54a6153920c984da","isMergeCommit":false,"messageTitle":"Add user stories, NFR, glossary to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":13}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8f2cd446594b6c4e3189b55c92b616ddef2fbc87","isMergeCommit":false,"messageTitle":"Add new line to end README for CI","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"4823adf9c3a62bb0add4ee20b14590f22c682ea9","isMergeCommit":true,"messageTitle":"Merge pull request #11 from nigel27022001/branch-DeveloperGuide","messageBody":"Add Use Cases to Developer Guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"74c85ae79fcc768064b99e1cebae52cbdb308ca3","isMergeCommit":false,"messageTitle":"Fix png issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bdebad7633f404473ea8452de526273d6f194e42","isMergeCommit":true,"messageTitle":"Merge pull request #25 from 0-yibai/branch-png-fix","messageBody":"Fix png issue","fileTypesAndContributionMap":{}}]}],"Joelwang22":[{"date":"2024-03-07","commitResults":[{"hash":"eb0ff60b302d72ecfbc01b5a8d81da865ae0bd53","isMergeCommit":false,"messageTitle":"Add Joel info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"ebfa2a444075165a819c5be2f99ab912bb8ddae5","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Joelwang22/add-joel-info","messageBody":"Add Joel info","fileTypesAndContributionMap":{}},{"hash":"9ccec53486f08bd4a4a9d7f431da43edd86f0f6f","isMergeCommit":false,"messageTitle":"Update UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":22}}},{"hash":"0ae19ef608d26acb8cd4b53b3eaf1b52a6eb62ea","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Joelwang22/branch-UserGuide","messageBody":"Update UserGuide","fileTypesAndContributionMap":{}},{"hash":"0379ed501219a656a4b0257f1744680535991d37","isMergeCommit":false,"messageTitle":"Fix intro of UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"36bc0f09986483e04a58bd4af29fcf6b8df2d2fb","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Joelwang22/branch-UserGuide","messageBody":"Fix intro of UserGuide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"899689aef07337295f2a174d06a3d095f7d73617","isMergeCommit":false,"messageTitle":"fix png issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"744b4cec71d86a5281acf7b1794b6cfac27fb972","isMergeCommit":true,"messageTitle":"Merge pull request #24 from Joelwang22/Fix-joelwang22.png","messageBody":"fix joelwang22.png ","fileTypesAndContributionMap":{}}]}],"bertrandong":[{"date":"2024-03-06","commitResults":[{"hash":"f26c708404035ca3e20cb70908f4ba14d0c2bd1b","isMergeCommit":false,"messageTitle":"Update Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":15}}},{"hash":"35198c31abf6a5340efbcc8ed92139f63ad6e156","isMergeCommit":true,"messageTitle":"Merge pull request #10 from bertrandong/update-readme","messageBody":"Update Readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"d9fb24f15e48de612ce3b9d71e0fcea9900c580d","isMergeCommit":false,"messageTitle":"Add Bertrand info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"f25d5d8baf872c328446f81c85f3e5ec52be21bc","isMergeCommit":true,"messageTitle":"Merge pull request #16 from bertrandong/add-bertrand-info","messageBody":"Add Bertrand info","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"c9dcae44b7d88cf07b0459d2f04d3b85c8c909e3","isMergeCommit":false,"messageTitle":"Fix png issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"15645b708d761652d255a75c1da083cff3b495dd","isMergeCommit":true,"messageTitle":"Merge pull request #23 from bertrandong/branch-fix-png","messageBody":"Fix png issue","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"nigel27022001":{"docs":133,"functional-code":0,"test-code":0},"chonghaoen":{"docs":34,"functional-code":19,"test-code":0},"0-yibai":{"docs":33,"functional-code":0,"test-code":0},"Joelwang22":{"docs":94,"functional-code":0,"test-code":0},"bertrandong":{"docs":38,"functional-code":0,"test-code":0}},"authorContributionVariance":{"nigel27022001":808.42285,"chonghaoen":200.27467,"0-yibai":110.25002,"Joelwang22":741.7562,"bertrandong":94.77778},"authorDisplayNameMap":{"nigel27022001":"CS2103T-T08-2 NIGE..TONG","chonghaoen":"CS2103T-T08-2 ISAA..O EN","0-yibai":"CS2103T-T08-2 YANG..IBAI","Joelwang22":"CS2103T-T08-2 WANG..JOEL","bertrandong":"CS2103T-T08-2 ONG ..RAND"}} +{"authorDailyContributionsMap":{"nigel27022001":[{"date":"2024-03-06","commitResults":[{"hash":"a3f2efb36fae29426785f1d92b7f5bdc1d3e320c","isMergeCommit":false,"messageTitle":"Add Use Cases to Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":117,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c88c0dccf094a9a38c3c3f703c6412e4112c57da","isMergeCommit":false,"messageTitle":"Fix Style Check Mistakes in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"9392adf069991ed83df521e384a452b9e5641771","isMergeCommit":false,"messageTitle":"Fix Readme.md stylecheck","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"98981b1b46aef54015ab4c2e51917fc9786c7582","isMergeCommit":true,"messageTitle":"Merge pull request #12 from 0-yibai/yibai/update-DG","messageBody":"Add user stories, NFR, glossary to developer guide","fileTypesAndContributionMap":{}},{"hash":"88ec1e05df514261102dfee4c5562885d235bd4b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of github.com:nigel27022001/tp into branch-DeveloperGuide","messageBody":"# Conflicts:\n#\tREADME.md\n","fileTypesAndContributionMap":{}},{"hash":"a159766918130480cd19f897782910f9226f46ed","isMergeCommit":false,"messageTitle":"Add nigel.md file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":0}}},{"hash":"ef0ca2465276d9c2938e106c80d485519938847b","isMergeCommit":true,"messageTitle":"Merge pull request #19 from nigel27022001/branch-Nigel-Info","messageBody":"Add nigel.md file","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"cdc939ff07876774a83e624327fbc8c85f6856e8","isMergeCommit":false,"messageTitle":"Fix nigel27022001.png","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1decddb87e357f97ec1143fa1b2de266b4593d83","isMergeCommit":true,"messageTitle":"Merge pull request #22 from nigel27022001/branch-png-fix","messageBody":"Fix nigel27022001.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"fff298a7c88b96caf47622b314712f5b2d446e73","isMergeCommit":false,"messageTitle":"Updated config.yml and DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":2}}},{"hash":"0779ce634007f1b321a2979a85d6de651cf6d390","isMergeCommit":true,"messageTitle":"Merge pull request #27 from nigel27022001/branch-fix-DG-and-config","messageBody":"Updated config.yml and DG","fileTypesAndContributionMap":{}}]}],"chonghaoen":[{"date":"2024-03-05","commitResults":[{"hash":"14870afb017e2eed2057ce3eb7976057cf246b02","isMergeCommit":false,"messageTitle":"Add Isaac info to team","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"5861bb187f7105d4e745a9e2fa2e00aa6885d083","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/chonghaoen/tp","messageBody":"* \u0027master\u0027 of https://github.com/chonghaoen/tp:\n Fix Readme.md stylecheck\n Fix Style Check Mistakes in DeveloperGuide.md\n Add new line to end README for CI\n Add user stories, NFR, glossary to developer guide\n Add Use Cases to Developer Guide\n Update Readme\n","fileTypesAndContributionMap":{}},{"hash":"4bbbc8e21ae1caac7f0d1abd3429b508c801d911","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a2ddcbf5d586723e6390ca63733424676163515f","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":30}}},{"hash":"17e4abb7033389c5632174c827518b6e040d4dba","isMergeCommit":true,"messageTitle":"Merge pull request #15 from chonghaoen/update-aboutus","messageBody":"Update aboutus","fileTypesAndContributionMap":{}},{"hash":"d8fbe816c10a2dc73b93881f52a7d76a3d1d8e50","isMergeCommit":false,"messageTitle":"Fix style of isaac.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0579236cd360d2d091c2946f5a8df9ad4e5c0a63","isMergeCommit":true,"messageTitle":"Merge pull request #8 from chonghaoen/add-isaac-info","messageBody":"Add Isaac info to team","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"6252eec9792750f8e531d8707362426c2f773123","isMergeCommit":false,"messageTitle":"Change Isaac Image to PNG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"510a2ba91402e18725c605756469bd85495397a4","isMergeCommit":true,"messageTitle":"Merge pull request #21 from chonghaoen/fix-image","messageBody":"Change Isaac Image to PNG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"05657ce51273e4df4ef09282625c60a2dcad185f","isMergeCommit":false,"messageTitle":"Add base order classes","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":19,"deletions":0}}},{"hash":"d20b1474b587a0733b5872f50d1c3829493d5446","isMergeCommit":true,"messageTitle":"Merge pull request #36 from chonghaoen/add-base-order","messageBody":"Add base order classes","fileTypesAndContributionMap":{}}]}],"0-yibai":[{"date":"2024-03-06","commitResults":[{"hash":"8739bdf08fe38755088d813c54a6153920c984da","isMergeCommit":false,"messageTitle":"Add user stories, NFR, glossary to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":13}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8f2cd446594b6c4e3189b55c92b616ddef2fbc87","isMergeCommit":false,"messageTitle":"Add new line to end README for CI","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"4823adf9c3a62bb0add4ee20b14590f22c682ea9","isMergeCommit":true,"messageTitle":"Merge pull request #11 from nigel27022001/branch-DeveloperGuide","messageBody":"Add Use Cases to Developer Guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"74c85ae79fcc768064b99e1cebae52cbdb308ca3","isMergeCommit":false,"messageTitle":"Fix png issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bdebad7633f404473ea8452de526273d6f194e42","isMergeCommit":true,"messageTitle":"Merge pull request #25 from 0-yibai/branch-png-fix","messageBody":"Fix png issue","fileTypesAndContributionMap":{}}]}],"Joelwang22":[{"date":"2024-03-07","commitResults":[{"hash":"eb0ff60b302d72ecfbc01b5a8d81da865ae0bd53","isMergeCommit":false,"messageTitle":"Add Joel info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"ebfa2a444075165a819c5be2f99ab912bb8ddae5","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Joelwang22/add-joel-info","messageBody":"Add Joel info","fileTypesAndContributionMap":{}},{"hash":"9ccec53486f08bd4a4a9d7f431da43edd86f0f6f","isMergeCommit":false,"messageTitle":"Update UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":22}}},{"hash":"0ae19ef608d26acb8cd4b53b3eaf1b52a6eb62ea","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Joelwang22/branch-UserGuide","messageBody":"Update UserGuide","fileTypesAndContributionMap":{}},{"hash":"0379ed501219a656a4b0257f1744680535991d37","isMergeCommit":false,"messageTitle":"Fix intro of UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"36bc0f09986483e04a58bd4af29fcf6b8df2d2fb","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Joelwang22/branch-UserGuide","messageBody":"Fix intro of UserGuide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"899689aef07337295f2a174d06a3d095f7d73617","isMergeCommit":false,"messageTitle":"fix png issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6ac12d95f8867b8970b3faa555c23fe1278bc5c4","isMergeCommit":false,"messageTitle":"Revert \"fix png issue\"","messageBody":"This reverts commit 899689aef07337295f2a174d06a3d095f7d73617.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"744b4cec71d86a5281acf7b1794b6cfac27fb972","isMergeCommit":true,"messageTitle":"Merge pull request #24 from Joelwang22/Fix-joelwang22.png","messageBody":"fix joelwang22.png ","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"fc71bf562b42e51c6bde3e20a623ed9653761dcf","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Joelwang22/Fix-joelwang22.png","messageBody":"Revert \"fix png issue\"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-12","commitResults":[{"hash":"01312ca9cff21044e283b930b65be5a1ed0bc6f3","isMergeCommit":false,"messageTitle":"add methods for order and product class add quantity class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":160,"deletions":0}}},{"hash":"1e4965925d28554e269f3b197c5131d5d0d6ab05","isMergeCommit":false,"messageTitle":"fix order","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":1}}},{"hash":"2a02b8f634dc13807db25598225b61a76336a604","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Joelwang22/branch-order","messageBody":"add methods for order and product class","fileTypesAndContributionMap":{}}]}],"bertrandong":[{"date":"2024-03-06","commitResults":[{"hash":"f26c708404035ca3e20cb70908f4ba14d0c2bd1b","isMergeCommit":false,"messageTitle":"Update Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":15}}},{"hash":"35198c31abf6a5340efbcc8ed92139f63ad6e156","isMergeCommit":true,"messageTitle":"Merge pull request #10 from bertrandong/update-readme","messageBody":"Update Readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"d9fb24f15e48de612ce3b9d71e0fcea9900c580d","isMergeCommit":false,"messageTitle":"Add Bertrand info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"f25d5d8baf872c328446f81c85f3e5ec52be21bc","isMergeCommit":true,"messageTitle":"Merge pull request #16 from bertrandong/add-bertrand-info","messageBody":"Add Bertrand info","fileTypesAndContributionMap":{}}]},{"date":"2024-03-09","commitResults":[{"hash":"c9dcae44b7d88cf07b0459d2f04d3b85c8c909e3","isMergeCommit":false,"messageTitle":"Fix png issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"15645b708d761652d255a75c1da083cff3b495dd","isMergeCommit":true,"messageTitle":"Merge pull request #23 from bertrandong/branch-fix-png","messageBody":"Fix png issue","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"nigel27022001":{"docs":133,"functional-code":0,"test-code":0},"chonghaoen":{"docs":34,"functional-code":19,"test-code":0},"0-yibai":{"docs":33,"functional-code":0,"test-code":0},"Joelwang22":{"docs":94,"functional-code":169,"test-code":0},"bertrandong":{"docs":38,"functional-code":0,"test-code":0}},"authorContributionVariance":{"nigel27022001":769.6675,"chonghaoen":191.00829,"0-yibai":104.84763,"Joelwang22":2045.723,"bertrandong":90.23821},"authorDisplayNameMap":{"nigel27022001":"CS2103T-T08-2 NIGE..TONG","chonghaoen":"CS2103T-T08-2 ISAA..O EN","0-yibai":"CS2103T-T08-2 YANG..IBAI","Joelwang22":"CS2103T-T08-2 WANG..JOEL","bertrandong":"CS2103T-T08-2 ONG ..RAND"}} diff --git a/AY2324S2-CS2103T-T10-3_tp_master/authorship.json b/AY2324S2-CS2103T-T10-3_tp_master/authorship.json index 2dba2a3a..2315779f 100644 --- a/AY2324S2-CS2103T-T10-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T10-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"taeewonnn"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-3/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp/graph/badge.svg?token\u003dGBPS86G6DT)](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp)","lastModifiedDate":"2024-02-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"taeewonnn"},"content":"### Eventy","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"taeewonnn"},"content":"* This CLI application serves as an address book tailored for event planners in halls, facilitating efficient management of participants and events. This is a CLI application that is desgined for users who type fast\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"taeewonnn"},"content":"### What does this do","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"taeewonnn"},"content":"* The project is tailored specifically for student event organizers and offers a new standard of convenient and easy event planning.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"taeewonnn"},"content":"* The application is targeted towards users who type fast and are used to CLI application. ","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"taeewonnn"},"content":"* It is named `Eventy` (`ET` for short) because we want to insert playfulness and efficiency into event planning. Plus it reminds you of a certain character! doesn\u0027t it :)","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"taeewonnn"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"taeewonnn":10,"-":12}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"myang2020"},"content":"We are the developer team of Eventy, an event management app, based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"myang2020"},"content":"## Project Team","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"myang2020"},"content":"### Nigel Lee","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/apzure.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/Apzure)]","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"myang2020"},"content":"- Team Lead, Scheduling and Tracking","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"myang2020"},"content":" - Overall project coordination","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"myang2020"},"content":" - Defining, assigning, and tracking project tasks","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"myang2020"},"content":"### Han Taewon","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/taeewonnn.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/taeewonnn)]","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"myang2020"},"content":"- Documentation, Deliverables and Deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"myang2020"},"content":" - Quality of various project documents","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"myang2020"},"content":" - Timeliness of project deliverables","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"myang2020"},"content":"### Max Yang","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/myang2020.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/myang2020)]","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"myang2020"},"content":"- Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"myang2020"},"content":" - Ensure testing of the project is done properly and on time","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"myang2020"},"content":"### Liu Yifan","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/nusliuyifan.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/nusliuyifan)]","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"myang2020"},"content":"- Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"myang2020"},"content":" - In charge of versioning of the code","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"myang2020"},"content":" - Maintaining the code repository","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"myang2020"},"content":" - Integrating various parts of the software to create a whole","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"myang2020"},"content":"### Yichao Song","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/chocoragdoll.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/ChocoRagdoll)]","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"myang2020"},"content":"- Code Quality","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"myang2020"},"content":" - Ensures adherence to coding standards","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"-":19,"myang2020":36}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"taeewonnn"},"content":"* Active members of university clubs and societies or school event committees","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"taeewonnn"},"content":"* Tech-savvy and reasonably comfortable with digital tools","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"taeewonnn"},"content":"* Fast typer","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"taeewonnn"},"content":"* Managing multiple events that range from small-scale meetings to large school-wide events","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"taeewonnn"},"content":"* Frequently communicating and coordinating with a variety of contacts including vendors, participants, volunteers, and school administrators","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"taeewonnn"},"content":"* Task driven with a need to balance multiple deadlines and responsibilities simultaneously","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"taeewonnn"},"content":"**Value proposition:**","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"taeewonnn"},"content":"The evolved AB3 contact management application, tailored specifically for student event organizers, offers a new standard of streamlined and automated contact organization. It serves as your single source of truth for storing, managing, and retrieving all contact-related information.","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":295,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | create a new event | plan and manage all the events that in one place |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | add a new person | manage all my contacts in one place |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | add participant to an event | manage and plan all the participant for a specific event |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | delete a person | remove contacts that I no longer need |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | remove specific participant | remove a specific participant from a specific event |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"taeewonnn"},"content":"| `* *` | diligent user | edit contact information | update contact information whenever necessary |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"taeewonnn"},"content":"| `* *` | user | select a specific event | search events by name without having to manually search |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"taeewonnn"},"content":"--------------------------------------------------------","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"taeewonnn"},"content":"### Creating an Event","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC01 - Create an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"taeewonnn"},"content":"1. User provides the details of an event to be created.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the event added by the User in the Event List. ","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"taeewonnn"},"content":"1a. Details provided by User are incomplete or invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"taeewonnn"},"content":"1b. Event to be added already exists in Eventy.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"taeewonnn"},"content":"### Deleting an event","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC02 - Delete an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added at least one event.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"taeewonnn"},"content":"A successful deletion deletes an event from the event list.","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"taeewonnn"},"content":"1. Eventy shows a list of events.","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"taeewonnn"},"content":"2. User requests to delete a specific event in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"taeewonnn"},"content":"3. Eventy deletes the event.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"taeewonnn"},"content":"1a. The list is empty. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"taeewonnn"},"content":"2a. Details provided by User are incomplete or invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"taeewonnn"},"content":"- 2a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"taeewonnn"},"content":" *Use case resumes at step 2.*","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"taeewonnn"},"content":"### Adding participants contact to the global list","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC03 - Add participants contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"taeewonnn"},"content":"A successful addition adds a participant to the global list.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"taeewonnn"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"taeewonnn"},"content":"1. User provides the detail of the contact to be added.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the contact added by the user. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"taeewonnn"},"content":"1a. Details provided by User are incomplete or invalid","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"taeewonnn"},"content":"### Deleting participant","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC04 - Delete a participant from the global participant list**","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** ","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"taeewonnn"},"content":"User has added one or more participant to the global participant list.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"taeewonnn"},"content":"A successful deletion deletes the participant from both the global list and all the events he participates in.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"taeewonnn"},"content":"1. User deletes a participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the updated global participant list. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"taeewonnn"},"content":"1a. Participant index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"taeewonnn"},"content":" *Use case resumes at step 2.*","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"taeewonnn"},"content":"### Removing participants from a specific event","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC05 - Remove a participant from the specified event**","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added one or more participant to the specified event.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"taeewonnn"},"content":"1. User requests to remove a participant from a certain event.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"taeewonnn"},"content":"2. Eventy remove the participant from the event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"taeewonnn"},"content":"1a. The event index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"taeewonnn"},"content":"1b. Participant index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"taeewonnn"},"content":"### Selecting an event","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC06 - Select an event from the event list**","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added one or more events to the event list.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"taeewonnn"},"content":"A successful selection displays the event details.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"taeewonnn"},"content":"1. User selects an event.","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the selected event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"taeewonnn"},"content":"1a. Event index provided by User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"taeewonnn"},"content":"### Add a participant to an event","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC07 - Add a participant to an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"taeewonnn"},"content":"User has added one or more contacts to the global contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"taeewonnn"},"content":"A successful addition adds a participant from the global list to the selected event.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"taeewonnn"},"content":"1. User inputs the index of participant to be added.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the added participant in the panel showing list of participants in selected event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"taeewonnn"},"content":"1a. Index provided by user is invalid/out of range of global contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"taeewonnn"},"content":"1b. Contact to be added already exists in selected event.","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"taeewonnn"},"content":"1b. User does not provide an index.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":481,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":482,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":483,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":484,"author":{"gitId":"taeewonnn"},"content":"### Non-Functional Requirements","lastModifiedDate":"2024-03-07"},{"lineNumber":485,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":486,"author":{"gitId":"taeewonnn"},"content":"1. The user should be able to use the application smoothly with a device running mainstream OS with Java 11 or above installed.","lastModifiedDate":"2024-03-07"},{"lineNumber":487,"author":{"gitId":"taeewonnn"},"content":"2. The application should be able to store up to 1000 participants and 50 events without a reduction in speed.","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"taeewonnn"},"content":"3. A user familiar with CLI applications with a reasonable typing speed should be able to navigate commands faster than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"taeewonnn"},"content":"4. The user interface should be simple, clear, easily understandable and fast to navigate.","lastModifiedDate":"2024-03-07"},{"lineNumber":490,"author":{"gitId":"taeewonnn"},"content":"5. The application should gracefully handle errors by displaying error messages to prevent system crashes and data corruption.","lastModifiedDate":"2024-03-07"},{"lineNumber":491,"author":{"gitId":"taeewonnn"},"content":"6. The application should be released as a free application to the general public.","lastModifiedDate":"2024-03-07"},{"lineNumber":492,"author":{"gitId":"taeewonnn"},"content":"7. The average command response time of Eventy should be less than a second.","lastModifiedDate":"2024-03-07"},{"lineNumber":493,"author":{"gitId":"taeewonnn"},"content":"8. The application should consume no more than 200Mb of memory when holding less than 1000 participants and 50 events.","lastModifiedDate":"2024-03-07"},{"lineNumber":494,"author":{"gitId":"taeewonnn"},"content":"9. The application should launch in less than 5 seconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":495,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":496,"author":{"gitId":"taeewonnn"},"content":"### Glossary","lastModifiedDate":"2024-03-07"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"taeewonnn"},"content":"* **Mainstream OS:** Windows, Linux, Unix, OS-X","lastModifiedDate":"2024-03-07"},{"lineNumber":499,"author":{"gitId":"taeewonnn"},"content":"* **Eventy:** Name of the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":500,"author":{"gitId":"taeewonnn"},"content":"* **Global participant list:** List of participants that are saved in the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":501,"author":{"gitId":"taeewonnn"},"content":"* **Event list:** List of events created in the application to be managed.","lastModifiedDate":"2024-03-07"},{"lineNumber":502,"author":{"gitId":"taeewonnn"},"content":"* **Event participant list:** List of participants in the specific event.","lastModifiedDate":"2024-03-07"},{"lineNumber":503,"author":{"gitId":"taeewonnn"},"content":"* **Participant:** The contact whose information is stored in the application storage.","lastModifiedDate":"2024-03-07"},{"lineNumber":504,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":512,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":513,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":365,"taeewonnn":192}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Apzure"},"content":"### Creating an event: `addev`","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"Apzure"},"content":"**Format:** `addev -ev \u003cevent name\u003e`","lastModifiedDate":"2024-03-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Apzure"},"content":"**Description:**","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Apzure"},"content":"Adds a new event with the specified name for the Event List.","lastModifiedDate":"2024-03-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"Apzure"},"content":"* `\u003cevent name\u003e` should be **alphanumeric**, **non-empty** and **not longer than 64 characters**.","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"Apzure"},"content":"* Adding an event with a name that already exists, regardless of case, is **not allowed.**","lastModifiedDate":"2024-03-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":61,"author":{"gitId":"Apzure"},"content":"**Examples:**","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"Apzure"},"content":"- `addev -ev Orientation camp` sffd a new event with the name `Orientation camp`.","lastModifiedDate":"2024-03-10"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":84,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Apzure":8,"-":82}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"taeewonnn"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-3/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp/graph/badge.svg?token\u003dGBPS86G6DT)](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp)","lastModifiedDate":"2024-02-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"taeewonnn"},"content":"### Eventy","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"taeewonnn"},"content":"* This CLI application serves as an address book tailored for event planners in halls, facilitating efficient management of participants and events. This is a CLI application that is desgined for users who type fast\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"taeewonnn"},"content":"### What does this do","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"taeewonnn"},"content":"* The project is tailored specifically for student event organizers and offers a new standard of convenient and easy event planning.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"taeewonnn"},"content":"* The application is targeted towards users who type fast and are used to CLI application. ","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"taeewonnn"},"content":"* It is named `Eventy` (`ET` for short) because we want to insert playfulness and efficiency into event planning. Plus it reminds you of a certain character! doesn\u0027t it :)","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"taeewonnn"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"taeewonnn":10,"-":12}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"myang2020"},"content":"We are the developer team of Eventy, an event management app, based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"myang2020"},"content":"## Project Team","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"myang2020"},"content":"### Nigel Lee","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/apzure.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/Apzure)]","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"myang2020"},"content":"- Team Lead, Scheduling and Tracking","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"myang2020"},"content":" - Overall project coordination","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"myang2020"},"content":" - Defining, assigning, and tracking project tasks","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"myang2020"},"content":"### Han Taewon","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/taeewonnn.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/taeewonnn)]","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"myang2020"},"content":"- Documentation, Deliverables and Deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"myang2020"},"content":" - Quality of various project documents","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"myang2020"},"content":" - Timeliness of project deliverables","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"myang2020"},"content":"### Max Yang","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/myang2020.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/myang2020)]","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"myang2020"},"content":"- Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"myang2020"},"content":" - Ensure testing of the project is done properly and on time","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"myang2020"},"content":"### Liu Yifan","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/nusliuyifan.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/nusliuyifan)]","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"myang2020"},"content":"- Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"myang2020"},"content":" - In charge of versioning of the code","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"myang2020"},"content":" - Maintaining the code repository","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"myang2020"},"content":" - Integrating various parts of the software to create a whole","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"myang2020"},"content":"### Yichao Song","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/chocoragdoll.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/ChocoRagdoll)]","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"myang2020"},"content":"- Code Quality","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"myang2020"},"content":" - Ensures adherence to coding standards","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"-":19,"myang2020":36}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"taeewonnn"},"content":"* Active members of university clubs and societies or school event committees","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"taeewonnn"},"content":"* Tech-savvy and reasonably comfortable with digital tools","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"taeewonnn"},"content":"* Fast typer","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"taeewonnn"},"content":"* Managing multiple events that range from small-scale meetings to large school-wide events","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"taeewonnn"},"content":"* Frequently communicating and coordinating with a variety of contacts including vendors, participants, volunteers, and school administrators","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"taeewonnn"},"content":"* Task driven with a need to balance multiple deadlines and responsibilities simultaneously","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"taeewonnn"},"content":"**Value proposition:**","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"taeewonnn"},"content":"The evolved AB3 contact management application, tailored specifically for student event organizers, offers a new standard of streamlined and automated contact organization. It serves as your single source of truth for storing, managing, and retrieving all contact-related information.","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":295,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | create a new event | plan and manage all the events that in one place |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | add a new person | manage all my contacts in one place |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | add participant to an event | manage and plan all the participant for a specific event |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | delete a person | remove contacts that I no longer need |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | remove specific participant | remove a specific participant from a specific event |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"taeewonnn"},"content":"| `* *` | diligent user | edit contact information | update contact information whenever necessary |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"taeewonnn"},"content":"| `* *` | user | select a specific event | search events by name without having to manually search |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"taeewonnn"},"content":"--------------------------------------------------------","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"taeewonnn"},"content":"### Creating an Event","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC01 - Create an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"taeewonnn"},"content":"1. User provides the details of an event to be created.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the event added by the User in the Event List. ","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"taeewonnn"},"content":"1a. Details provided by User are incomplete or invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"taeewonnn"},"content":"1b. Event to be added already exists in Eventy.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"taeewonnn"},"content":"### Deleting an event","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC02 - Delete an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added at least one event.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"taeewonnn"},"content":"A successful deletion deletes an event from the event list.","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"taeewonnn"},"content":"1. Eventy shows a list of events.","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"taeewonnn"},"content":"2. User requests to delete a specific event in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"taeewonnn"},"content":"3. Eventy deletes the event.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"taeewonnn"},"content":"1a. The list is empty. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"taeewonnn"},"content":"2a. Details provided by User are incomplete or invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"taeewonnn"},"content":"- 2a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"taeewonnn"},"content":" *Use case resumes at step 2.*","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"taeewonnn"},"content":"### Adding participants contact to the global list","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC03 - Add participants contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"taeewonnn"},"content":"A successful addition adds a participant to the global list.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"taeewonnn"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"taeewonnn"},"content":"1. User provides the detail of the contact to be added.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the contact added by the user. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"taeewonnn"},"content":"1a. Details provided by User are incomplete or invalid","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"taeewonnn"},"content":"### Deleting participant","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC04 - Delete a participant from the global participant list**","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** ","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"taeewonnn"},"content":"User has added one or more participant to the global participant list.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"taeewonnn"},"content":"A successful deletion deletes the participant from both the global list and all the events he participates in.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"taeewonnn"},"content":"1. User deletes a participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the updated global participant list. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"taeewonnn"},"content":"1a. Participant index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"taeewonnn"},"content":" *Use case resumes at step 2.*","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"taeewonnn"},"content":"### Removing participants from a specific event","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC05 - Remove a participant from the specified event**","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added one or more participant to the specified event.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"taeewonnn"},"content":"1. User requests to remove a participant from a certain event.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"taeewonnn"},"content":"2. Eventy remove the participant from the event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"taeewonnn"},"content":"1a. The event index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"taeewonnn"},"content":"1b. Participant index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"taeewonnn"},"content":"### Selecting an event","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC06 - Select an event from the event list**","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added one or more events to the event list.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"taeewonnn"},"content":"A successful selection displays the event details.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"taeewonnn"},"content":"1. User selects an event.","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the selected event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"taeewonnn"},"content":"1a. Event index provided by User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"taeewonnn"},"content":"### Add a participant to an event","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC07 - Add a participant to an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"taeewonnn"},"content":"User has added one or more contacts to the global contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"taeewonnn"},"content":"A successful addition adds a participant from the global list to the selected event.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"taeewonnn"},"content":"1. User inputs the index of participant to be added.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the added participant in the panel showing list of participants in selected event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"taeewonnn"},"content":"1a. Index provided by user is invalid/out of range of global contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"taeewonnn"},"content":"1b. Contact to be added already exists in selected event.","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"taeewonnn"},"content":"1b. User does not provide an index.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":481,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":482,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":483,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":484,"author":{"gitId":"taeewonnn"},"content":"### Non-Functional Requirements","lastModifiedDate":"2024-03-07"},{"lineNumber":485,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":486,"author":{"gitId":"taeewonnn"},"content":"1. The user should be able to use the application smoothly with a device running mainstream OS with Java 11 or above installed.","lastModifiedDate":"2024-03-07"},{"lineNumber":487,"author":{"gitId":"taeewonnn"},"content":"2. The application should be able to store up to 1000 participants and 50 events without a reduction in speed.","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"taeewonnn"},"content":"3. A user familiar with CLI applications with a reasonable typing speed should be able to navigate commands faster than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"taeewonnn"},"content":"4. The user interface should be simple, clear, easily understandable and fast to navigate.","lastModifiedDate":"2024-03-07"},{"lineNumber":490,"author":{"gitId":"taeewonnn"},"content":"5. The application should gracefully handle errors by displaying error messages to prevent system crashes and data corruption.","lastModifiedDate":"2024-03-07"},{"lineNumber":491,"author":{"gitId":"taeewonnn"},"content":"6. The application should be released as a free application to the general public.","lastModifiedDate":"2024-03-07"},{"lineNumber":492,"author":{"gitId":"taeewonnn"},"content":"7. The average command response time of Eventy should be less than a second.","lastModifiedDate":"2024-03-07"},{"lineNumber":493,"author":{"gitId":"taeewonnn"},"content":"8. The application should consume no more than 200Mb of memory when holding less than 1000 participants and 50 events.","lastModifiedDate":"2024-03-07"},{"lineNumber":494,"author":{"gitId":"taeewonnn"},"content":"9. The application should launch in less than 5 seconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":495,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":496,"author":{"gitId":"taeewonnn"},"content":"### Glossary","lastModifiedDate":"2024-03-07"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"taeewonnn"},"content":"* **Mainstream OS:** Windows, Linux, Unix, OS-X","lastModifiedDate":"2024-03-07"},{"lineNumber":499,"author":{"gitId":"taeewonnn"},"content":"* **Eventy:** Name of the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":500,"author":{"gitId":"taeewonnn"},"content":"* **Global participant list:** List of participants that are saved in the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":501,"author":{"gitId":"taeewonnn"},"content":"* **Event list:** List of events created in the application to be managed.","lastModifiedDate":"2024-03-07"},{"lineNumber":502,"author":{"gitId":"taeewonnn"},"content":"* **Event participant list:** List of participants in the specific event.","lastModifiedDate":"2024-03-07"},{"lineNumber":503,"author":{"gitId":"taeewonnn"},"content":"* **Participant:** The contact whose information is stored in the application storage.","lastModifiedDate":"2024-03-07"},{"lineNumber":504,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":512,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":513,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":365,"taeewonnn":192}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"Apzure"},"content":"### Creating an event: `addev`","lastModifiedDate":"2024-03-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"Apzure"},"content":"**Format:** `addev -ev \u003cevent name\u003e`","lastModifiedDate":"2024-03-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Apzure"},"content":"**Description:**","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Apzure"},"content":"Adds a new event with the specified name for the Event List.","lastModifiedDate":"2024-03-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"Apzure"},"content":"* `\u003cevent name\u003e` should be **alphanumeric**, **non-empty** and **not longer than 64 characters**.","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"Apzure"},"content":"* Adding an event with a name that already exists, regardless of case, is **not allowed.**","lastModifiedDate":"2024-03-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":62,"author":{"gitId":"Apzure"},"content":"**Examples:**","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"taeewonnn"},"content":"- `addev -ev Orientation camp` adds a new event with the name `Orientation camp`.","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"taeewonnn"},"content":"### Deleting an event: `delev`","lastModifiedDate":"2024-03-10"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"taeewonnn"},"content":"**Format:** `delev \u003cindex\u003e`","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"taeewonnn"},"content":"**Description:**","lastModifiedDate":"2024-03-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"taeewonnn"},"content":"Deletes an event and all its relevant information with its index in the event list.","lastModifiedDate":"2024-03-10"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"taeewonnn"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"taeewonnn"},"content":"**Caution:**","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"taeewonnn"},"content":"* `\u003cindex\u003e` should be **numeric** and **non-empty**.","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"taeewonnn"},"content":"**Examples:**","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"taeewonnn"},"content":"- `delev 1` deletes the 1st event in the displayed list.","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"taeewonnn"},"content":"### Adding participant and their information to the global participant list: `addp`","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"taeewonnn"},"content":"**Format:** `addp -n \u003cparticipant name\u003e -p \u003cphone number\u003e -e \u003cemail\u003e`","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"taeewonnn"},"content":"**Description:**","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":89,"author":{"gitId":"taeewonnn"},"content":"Adds a new participant to the app, allowing them to be added to an event later.","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":93,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"taeewonnn"},"content":"* `\u003cparticipant name\u003e` should be **alphabetic**, **non-empty** and **not longer than 64 characters**.","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"taeewonnn"},"content":"* `\u003cphone number\u003e` should be **numeric**, **non-empty** and **not longer than 15 digits**.","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"taeewonnn"},"content":"* `\u003cemail\u003e` should be **alphanumeric**, **non-empty** and **not longer than 64 characters**.","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"taeewonnn"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2021-02-04"},{"lineNumber":100,"author":{"gitId":"taeewonnn"},"content":"**Examples:**","lastModifiedDate":"2024-03-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"taeewonnn"},"content":"- `addp -n David -p 98987676 -e david@example.com` adds a participant named `David` ","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"taeewonnn"},"content":"with the phone number `98987676` and email of `david@example.com` to the displayed contacts list.","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":124,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Apzure":7,"-":102,"taeewonnn":21}}] diff --git a/AY2324S2-CS2103T-T10-3_tp_master/commits.json b/AY2324S2-CS2103T-T10-3_tp_master/commits.json index 7acb0899..cde59957 100644 --- a/AY2324S2-CS2103T-T10-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T10-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Apzure":[{"date":"2024-03-01","commitResults":[{"hash":"7cf00ce62f5c66c95e74d5206be3c397635ca505","isMergeCommit":true,"messageTitle":"Merge pull request #9 from taeewonnn/update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"bd1eadc4b81baead532e60bcb7fb7e826fccde11","isMergeCommit":true,"messageTitle":"Merge pull request #12 from taeewonnn/update-README","messageBody":"Fix GFMD","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"71b54dc2dc68913e28508b22b40a3a955f70d18a","isMergeCommit":false,"messageTitle":"Document Create Event Command in UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":122}}}]},{"date":"2024-03-07","commitResults":[{"hash":"81dd327a4ce186191fafba4593b5ba6b90f4ea24","isMergeCommit":true,"messageTitle":"Merge pull request #13 from myang2020/AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"4acc6fc0ccda79e2ee616f944a79a9aa7f8007c0","isMergeCommit":true,"messageTitle":"Merge pull request #18 from taeewonnn/document-DG","messageBody":"Modify DG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"786625dd9f99159290d1199357addc362d5dd522","isMergeCommit":false,"messageTitle":"Change Command name to addev","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}],"nusliuyifan":[],"ChocoRagdoll":[],"taeewonnn":[{"date":"2024-02-29","commitResults":[{"hash":"159f028e4b4133b90bd9129ac30d346895c02ce5","isMergeCommit":false,"messageTitle":"Update README","messageBody":"Let\u0027s update README file and upload mock UI image\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":3}}}]},{"date":"2024-03-01","commitResults":[{"hash":"8ac632def05a6dabddebfc9f65e0f457b48cfb4b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-02","commitResults":[{"hash":"35d21a156592acc62436aa9a7d097d6f0a78b4a9","isMergeCommit":false,"messageTitle":"Fix GFMD","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-05","commitResults":[{"hash":"4f605e5315aff61dcf6ffc555e7f94d4bc5b0262","isMergeCommit":false,"messageTitle":"Modify DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":12}}}]},{"date":"2024-03-07","commitResults":[{"hash":"2f796666b1104c7b60071a3e0637dbdffa97618a","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":179,"deletions":22}}}]},{"date":"2024-03-11","commitResults":[{"hash":"f0c2a718fc2f7b803e7014c1d4c14b431f0a5ef0","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Apzure/branch-user-guide","messageBody":"Document Create Event Command in UG","fileTypesAndContributionMap":{}}]}],"myang2020":[{"date":"2024-02-29","commitResults":[{"hash":"17f988724f313f112ea30f88ed1b6ed07c9d2368","isMergeCommit":false,"messageTitle":"Add images to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]},{"date":"2024-03-03","commitResults":[{"hash":"118e8c6cee2e6e2fe86583a23972c614e14a80a0","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":9}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d9196a2529d661340ec72c68afba364d5d82dcbb","isMergeCommit":false,"messageTitle":"Fixed roles and responsibilities","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":17}}},{"hash":"110878606fe34bbb2065a897506e34ec8d323258","isMergeCommit":false,"messageTitle":"Fix AboutUs layout","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"250a091f5e9cb32a66b0378bd04f3f0fa48f8441","isMergeCommit":false,"messageTitle":"no message","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":5}}}]},{"date":"2024-03-07","commitResults":[{"hash":"5409793dea670f1e9340414896573a08b3df95ed","isMergeCommit":false,"messageTitle":"Beautify AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":19}}},{"hash":"f40bf1dde86de78da50030293f24a2dc49994772","isMergeCommit":false,"messageTitle":"Finalize AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":33}}},{"hash":"bb9a36868f78633cb42c2c37c208722f27acca40","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"b2eb78d5ac9c2f731ea2368390351ab506d51076","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"a51c1c5b4d713a64b1215c1c6f555f39bff5eed1","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2e38c3dc6ac1551ffd5d3664e1aef35246f6bf94","isMergeCommit":false,"messageTitle":"Fix EOF error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"Apzure":{"docs":8,"functional-code":0,"test-code":0},"nusliuyifan":{"docs":0,"functional-code":0,"test-code":0},"ChocoRagdoll":{"docs":0,"functional-code":0,"test-code":0},"taeewonnn":{"docs":202,"functional-code":0,"test-code":0},"myang2020":{"docs":36,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Apzure":883.9507,"nusliuyifan":0.0,"ChocoRagdoll":0.0,"taeewonnn":2108.7288,"myang2020":940.5063},"authorDisplayNameMap":{"Apzure":"CS2103T-T10-3 NIGE..N YI","nusliuyifan":"CS2103T-T10-3 LIU ..IFAN","ChocoRagdoll":"CS2103T-T10-3 SONG..CHAO","taeewonnn":"CS2103T-T10-3 HAN .. WON","myang2020":"CS2103T-T10-3 YANG..X CK"}} +{"authorDailyContributionsMap":{"Apzure":[{"date":"2024-03-01","commitResults":[{"hash":"7cf00ce62f5c66c95e74d5206be3c397635ca505","isMergeCommit":true,"messageTitle":"Merge pull request #9 from taeewonnn/update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"bd1eadc4b81baead532e60bcb7fb7e826fccde11","isMergeCommit":true,"messageTitle":"Merge pull request #12 from taeewonnn/update-README","messageBody":"Fix GFMD","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"71b54dc2dc68913e28508b22b40a3a955f70d18a","isMergeCommit":false,"messageTitle":"Document Create Event Command in UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":122}}}]},{"date":"2024-03-07","commitResults":[{"hash":"81dd327a4ce186191fafba4593b5ba6b90f4ea24","isMergeCommit":true,"messageTitle":"Merge pull request #13 from myang2020/AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"4acc6fc0ccda79e2ee616f944a79a9aa7f8007c0","isMergeCommit":true,"messageTitle":"Merge pull request #18 from taeewonnn/document-DG","messageBody":"Modify DG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-10","commitResults":[{"hash":"786625dd9f99159290d1199357addc362d5dd522","isMergeCommit":false,"messageTitle":"Change Command name to addev","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}],"nusliuyifan":[],"ChocoRagdoll":[],"taeewonnn":[{"date":"2024-02-29","commitResults":[{"hash":"159f028e4b4133b90bd9129ac30d346895c02ce5","isMergeCommit":false,"messageTitle":"Update README","messageBody":"Let\u0027s update README file and upload mock UI image\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":3}}}]},{"date":"2024-03-01","commitResults":[{"hash":"8ac632def05a6dabddebfc9f65e0f457b48cfb4b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-02","commitResults":[{"hash":"35d21a156592acc62436aa9a7d097d6f0a78b4a9","isMergeCommit":false,"messageTitle":"Fix GFMD","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-05","commitResults":[{"hash":"23a1cf86fd275dab1532cc7676ea50f30ff07468","isMergeCommit":false,"messageTitle":"Document Delete and Add Command in UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":114}}},{"hash":"4f605e5315aff61dcf6ffc555e7f94d4bc5b0262","isMergeCommit":false,"messageTitle":"Modify DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":12}}}]},{"date":"2024-03-07","commitResults":[{"hash":"2f796666b1104c7b60071a3e0637dbdffa97618a","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":179,"deletions":22}}}]},{"date":"2024-03-10","commitResults":[{"hash":"996df9f81c651cda57276b70766b548d692f85ea","isMergeCommit":false,"messageTitle":"Modify delete event and add part command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]},{"date":"2024-03-11","commitResults":[{"hash":"f0c2a718fc2f7b803e7014c1d4c14b431f0a5ef0","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Apzure/branch-user-guide","messageBody":"Document Create Event Command in UG","fileTypesAndContributionMap":{}},{"hash":"64a6ccc63d139e4da0e919f0dc4ead48cb58257a","isMergeCommit":false,"messageTitle":"Modify UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3f7944d6a6884706732b8247dd7cf53d1d5b7e86","isMergeCommit":true,"messageTitle":"Fix merge conflict one","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b07c1e0a352e7c630e1eb43d69782044ac537d31","isMergeCommit":false,"messageTitle":"Modify examples","messageBody":"Examples given seem very technical\n\nLet\u0027s fix that\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"81dc21fa1073f1edbebe98c3a1e98353a8d8872f","isMergeCommit":false,"messageTitle":"Update parameters","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"000acd70cb1942b6fcd47ae0ae16fb03514086f9","isMergeCommit":true,"messageTitle":"Merge pull request #17 from taeewonnn/document-delete,createCommand","messageBody":"Document Delete and Add Command in UG","fileTypesAndContributionMap":{}}]}],"myang2020":[{"date":"2024-02-29","commitResults":[{"hash":"17f988724f313f112ea30f88ed1b6ed07c9d2368","isMergeCommit":false,"messageTitle":"Add images to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]},{"date":"2024-03-03","commitResults":[{"hash":"118e8c6cee2e6e2fe86583a23972c614e14a80a0","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":9}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d9196a2529d661340ec72c68afba364d5d82dcbb","isMergeCommit":false,"messageTitle":"Fixed roles and responsibilities","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":17}}},{"hash":"110878606fe34bbb2065a897506e34ec8d323258","isMergeCommit":false,"messageTitle":"Fix AboutUs layout","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"250a091f5e9cb32a66b0378bd04f3f0fa48f8441","isMergeCommit":false,"messageTitle":"no message","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":5}}}]},{"date":"2024-03-07","commitResults":[{"hash":"5409793dea670f1e9340414896573a08b3df95ed","isMergeCommit":false,"messageTitle":"Beautify AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":19}}},{"hash":"f40bf1dde86de78da50030293f24a2dc49994772","isMergeCommit":false,"messageTitle":"Finalize AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":33}}},{"hash":"bb9a36868f78633cb42c2c37c208722f27acca40","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"b2eb78d5ac9c2f731ea2368390351ab506d51076","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"a51c1c5b4d713a64b1215c1c6f555f39bff5eed1","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2e38c3dc6ac1551ffd5d3664e1aef35246f6bf94","isMergeCommit":false,"messageTitle":"Fix EOF error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"Apzure":{"docs":7,"functional-code":0,"test-code":0},"nusliuyifan":{"docs":0,"functional-code":0,"test-code":0},"ChocoRagdoll":{"docs":0,"functional-code":0,"test-code":0},"taeewonnn":{"docs":223,"functional-code":0,"test-code":0},"myang2020":{"docs":36,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Apzure":883.9507,"nusliuyifan":0.0,"ChocoRagdoll":0.0,"taeewonnn":3196.6082,"myang2020":940.5063},"authorDisplayNameMap":{"Apzure":"CS2103T-T10-3 NIGE..N YI","nusliuyifan":"CS2103T-T10-3 LIU ..IFAN","ChocoRagdoll":"CS2103T-T10-3 SONG..CHAO","taeewonnn":"CS2103T-T10-3 HAN .. WON","myang2020":"CS2103T-T10-3 YANG..X CK"}} diff --git a/AY2324S2-CS2103T-T12-3_tp_master/authorship.json b/AY2324S2-CS2103T-T12-3_tp_master/authorship.json index e0893fff..0804c306 100644 --- a/AY2324S2-CS2103T-T12-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T12-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"ChuaZenKhoon"},"content":"### Chua Zen Khoon","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"ChuaZenKhoon"},"content":"\u003cimg src\u003d\"images/chuazenkhoon.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"ChuaZenKhoon"},"content":"[[github](https://github.com/ChuaZenKhoon)]","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"ChuaZenKhoon"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"ChuaZenKhoon"},"content":" Y2 CS student. I do creative works such as writing and worldbuilding in my free time!","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"ChuaZenKhoon"},"content":"* Role: Project Planner","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"ChuaZenKhoon"},"content":"* Responsibilities: Deliverables and Deadlines, Scheduling and Tracking","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":30,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ChuaZenKhoon":7,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"ljy0422"},"content":"(For all use cases below, the **System** is the `Hi:Re` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-08"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":305,"author":{"gitId":"ljy0422"},"content":"**Use case: UC1 - Add a contact**","lastModifiedDate":"2024-03-08"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-08"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":309,"author":{"gitId":"ljy0422"},"content":"1. User requests to add a new contact and input the contact information","lastModifiedDate":"2024-03-08"},{"lineNumber":310,"author":{"gitId":"ljy0422"},"content":"2. Hi:Re adds the person to the database","lastModifiedDate":"2024-03-08"},{"lineNumber":311,"author":{"gitId":"ChuaZenKhoon"},"content":"3. Hi:Re shows a message for the successful addition","lastModifiedDate":"2024-03-08"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":313,"author":{"gitId":"ljy0422"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-08"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":317,"author":{"gitId":"ljy0422"},"content":"* 1a. The input format is wrong and cannot be accepted","lastModifiedDate":"2024-03-08"},{"lineNumber":318,"author":{"gitId":"ljy0422"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":319,"author":{"gitId":"ljy0422"},"content":" * 1a1. Hi:Re shows an error message","lastModifiedDate":"2024-03-08"},{"lineNumber":320,"author":{"gitId":"ljy0422"},"content":" ","lastModifiedDate":"2024-03-08"},{"lineNumber":321,"author":{"gitId":"ljy0422"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"ChuaZenKhoon"},"content":"**Use case: UC2 - Delete a contact**","lastModifiedDate":"2024-03-08"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"ChuaZenKhoon"},"content":"1. User requests to delete a specific person in the database and input the details","lastModifiedDate":"2024-03-08"},{"lineNumber":329,"author":{"gitId":"ChuaZenKhoon"},"content":"2. Hi:Re deletes the person","lastModifiedDate":"2024-03-08"},{"lineNumber":330,"author":{"gitId":"ChuaZenKhoon"},"content":"3. Hi:Re shows a message for the successful deletion","lastModifiedDate":"2024-03-08"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"ChuaZenKhoon"},"content":"* 1a. The given details is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"ChuaZenKhoon"},"content":" * 1a1. Hi:Re shows an error message","lastModifiedDate":"2024-03-08"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"ChuaZenKhoon"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"ChuaZenKhoon"},"content":"2. Should be able to hold up to 1000 employees without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-08"},{"lineNumber":347,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"ChuaZenKhoon"},"content":"4. Should take less than 3 seconds for the application to finish processing a command and display the results.","lastModifiedDate":"2024-03-08"},{"lineNumber":349,"author":{"gitId":"ChuaZenKhoon"},"content":"5. Should work on any 32 bit or 64 bit OS.","lastModifiedDate":"2024-03-08"},{"lineNumber":350,"author":{"gitId":"ChuaZenKhoon"},"content":"6. Should be usable by any regular employee with little to no technical expertise.","lastModifiedDate":"2024-03-08"},{"lineNumber":351,"author":{"gitId":"ChuaZenKhoon"},"content":"7. Should have no differences in behaviour or performance between Windows 10 and 11.","lastModifiedDate":"2024-03-08"},{"lineNumber":352,"author":{"gitId":"ChuaZenKhoon"},"content":"8. A HR employee should not be able to see sensitive information but an executive or someone with higher system authority can.","lastModifiedDate":"2024-03-08"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Mainstream OS**: Operating Systems (OS) such as Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-08"},{"lineNumber":357,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"ChuaZenKhoon"},"content":"* **HR**: Human Resource, a department associated with managing employee benefits and recruitment","lastModifiedDate":"2024-03-08"},{"lineNumber":359,"author":{"gitId":"ChuaZenKhoon"},"content":"* **MSS**: Main Success Scenario, the main flow of events in a use case","lastModifiedDate":"2024-03-08"},{"lineNumber":360,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Technical expertise**: Any relevant experience in using a computer and software on it","lastModifiedDate":"2024-03-08"},{"lineNumber":361,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Sensitive information**: Important information relating to a person that may cause privacy concerns such as ID details or bank account details.","lastModifiedDate":"2024-03-08"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":371,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":372,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ChuaZenKhoon":19,"-":387,"ljy0422":10}}] +[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"ChuaZenKhoon"},"content":"### Chua Zen Khoon","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"ChuaZenKhoon"},"content":"\u003cimg src\u003d\"images/chuazenkhoon.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"ChuaZenKhoon"},"content":"[[github](https://github.com/ChuaZenKhoon)]","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"ChuaZenKhoon"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"ChuaZenKhoon"},"content":" Y2 CS student. I do creative works such as writing and worldbuilding in my free time!","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"ChuaZenKhoon"},"content":"* Role: Project Planner","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"ChuaZenKhoon"},"content":"* Responsibilities: Deliverables and Deadlines, Scheduling and Tracking","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":30,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ChuaZenKhoon":7,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"tcjazwei"},"content":"* HR / Executives with access to company contactsw","lastModifiedDate":"2024-03-09"},{"lineNumber":278,"author":{"gitId":"tcjazwei"},"content":"* needs to update / contact people frequently","lastModifiedDate":"2024-03-09"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"tcjazwei"},"content":"**Value proposition**: access and manage multitudes of contacts quickly and easily","lastModifiedDate":"2024-03-09"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"tcjazwei"},"content":"|----------|--------------------|---------------------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-09"},{"lineNumber":292,"author":{"gitId":"tcjazwei"},"content":"| `* * *` | HR employee | add new contacts | |","lastModifiedDate":"2024-03-09"},{"lineNumber":293,"author":{"gitId":"tcjazwei"},"content":"| `* * *` | HR employee | delete contacts | remove entries that I no longer need |","lastModifiedDate":"2024-03-09"},{"lineNumber":294,"author":{"gitId":"tcjazwei"},"content":"| `* * *` | HR employee | toggle address book visibility | be able to hide it for simplicity |","lastModifiedDate":"2024-03-09"},{"lineNumber":295,"author":{"gitId":"tcjazwei"},"content":"| `* *` | first time user | not have a cluttered GUI | will not be confused |","lastModifiedDate":"2024-03-09"},{"lineNumber":296,"author":{"gitId":"tcjazwei"},"content":"| `* *` | potential user | see examples in the database | examine how it should look like when I start using the app for work |","lastModifiedDate":"2024-03-09"},{"lineNumber":297,"author":{"gitId":"tcjazwei"},"content":"| `* *` | frequent user | optimize command typing | accomplish work efficiently |","lastModifiedDate":"2024-03-09"},{"lineNumber":298,"author":{"gitId":"tcjazwei"},"content":"| `* *` | frequent user | quickly scan the database | check for missing details |","lastModifiedDate":"2024-03-09"},{"lineNumber":299,"author":{"gitId":"tcjazwei"},"content":"| `* *` | frequent user | search for specific information | optimize my work performance |","lastModifiedDate":"2024-03-09"},{"lineNumber":300,"author":{"gitId":"tcjazwei"},"content":"| `* *` | potential user | update contact details | keep the information in the book up to date |","lastModifiedDate":"2024-03-09"},{"lineNumber":301,"author":{"gitId":"tcjazwei"},"content":"| `* *` | HR manager | search for contacts via their attributes | can easily find a specific person |","lastModifiedDate":"2024-03-09"},{"lineNumber":302,"author":{"gitId":"tcjazwei"},"content":"| `* *` | frequent user | automatically delete duplicate contacts | stay organized |","lastModifiedDate":"2024-03-09"},{"lineNumber":303,"author":{"gitId":"tcjazwei"},"content":"| `* *` | HR manager | sort employee contacts via their attributes | can find employees that fit specific criteria |","lastModifiedDate":"2024-03-09"},{"lineNumber":304,"author":{"gitId":"tcjazwei"},"content":"| `* *` | employer | be informed of understaffed departments | HR can hire accordingly |","lastModifiedDate":"2024-03-09"},{"lineNumber":305,"author":{"gitId":"tcjazwei"},"content":"| `* *` | HR manager | attach tags or notes to contacts | adding personal reminders or categorizations |","lastModifiedDate":"2024-03-09"},{"lineNumber":306,"author":{"gitId":"tcjazwei"},"content":"\u003c!--","lastModifiedDate":"2024-03-09"},{"lineNumber":307,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"tcjazwei"},"content":"--\u003e","lastModifiedDate":"2024-03-09"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"ljy0422"},"content":"(For all use cases below, the **System** is the `Hi:Re` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-08"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":321,"author":{"gitId":"ljy0422"},"content":"**Use case: UC1 - Add a contact**","lastModifiedDate":"2024-03-08"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":323,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-08"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":325,"author":{"gitId":"ljy0422"},"content":"1. User requests to add a new contact and input the contact information","lastModifiedDate":"2024-03-08"},{"lineNumber":326,"author":{"gitId":"ljy0422"},"content":"2. Hi:Re adds the person to the database","lastModifiedDate":"2024-03-08"},{"lineNumber":327,"author":{"gitId":"ChuaZenKhoon"},"content":"3. Hi:Re shows a message for the successful addition","lastModifiedDate":"2024-03-08"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":329,"author":{"gitId":"ljy0422"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-08"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":333,"author":{"gitId":"ljy0422"},"content":"* 1a. The input format is wrong and cannot be accepted","lastModifiedDate":"2024-03-08"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":335,"author":{"gitId":"ljy0422"},"content":" * 1a1. Hi:Re shows an error message","lastModifiedDate":"2024-03-08"},{"lineNumber":336,"author":{"gitId":"ljy0422"},"content":" ","lastModifiedDate":"2024-03-08"},{"lineNumber":337,"author":{"gitId":"ljy0422"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"ChuaZenKhoon"},"content":"**Use case: UC2 - Delete a contact**","lastModifiedDate":"2024-03-08"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"ChuaZenKhoon"},"content":"1. User requests to delete a specific person in the database and input the details","lastModifiedDate":"2024-03-08"},{"lineNumber":345,"author":{"gitId":"ChuaZenKhoon"},"content":"2. Hi:Re deletes the person","lastModifiedDate":"2024-03-08"},{"lineNumber":346,"author":{"gitId":"ChuaZenKhoon"},"content":"3. Hi:Re shows a message for the successful deletion","lastModifiedDate":"2024-03-08"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"ChuaZenKhoon"},"content":"* 1a. The given details is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"ChuaZenKhoon"},"content":" * 1a1. Hi:Re shows an error message","lastModifiedDate":"2024-03-08"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"ChuaZenKhoon"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"ChuaZenKhoon"},"content":"2. Should be able to hold up to 1000 employees without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-08"},{"lineNumber":363,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"ChuaZenKhoon"},"content":"4. Should take less than 3 seconds for the application to finish processing a command and display the results.","lastModifiedDate":"2024-03-08"},{"lineNumber":365,"author":{"gitId":"ChuaZenKhoon"},"content":"5. Should work on any 32 bit or 64 bit OS.","lastModifiedDate":"2024-03-08"},{"lineNumber":366,"author":{"gitId":"ChuaZenKhoon"},"content":"6. Should be usable by any regular employee with little to no technical expertise.","lastModifiedDate":"2024-03-08"},{"lineNumber":367,"author":{"gitId":"ChuaZenKhoon"},"content":"7. Should have no differences in behaviour or performance between Windows 10 and 11.","lastModifiedDate":"2024-03-08"},{"lineNumber":368,"author":{"gitId":"ChuaZenKhoon"},"content":"8. A HR employee should not be able to see sensitive information but an executive or someone with higher system authority can.","lastModifiedDate":"2024-03-08"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Mainstream OS**: Operating Systems (OS) such as Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-08"},{"lineNumber":373,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"ChuaZenKhoon"},"content":"* **HR**: Human Resource, a department associated with managing employee benefits and recruitment","lastModifiedDate":"2024-03-08"},{"lineNumber":375,"author":{"gitId":"ChuaZenKhoon"},"content":"* **MSS**: Main Success Scenario, the main flow of events in a use case","lastModifiedDate":"2024-03-08"},{"lineNumber":376,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Technical expertise**: Any relevant experience in using a computer and software on it","lastModifiedDate":"2024-03-08"},{"lineNumber":377,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Sensitive information**: Important information relating to a person that may cause privacy concerns such as ID details or bank account details.","lastModifiedDate":"2024-03-08"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":387,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":388,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"tcjazwei":20,"ChuaZenKhoon":19,"-":384,"ljy0422":9}}] diff --git a/AY2324S2-CS2103T-T12-3_tp_master/commits.json b/AY2324S2-CS2103T-T12-3_tp_master/commits.json index 63999e98..82bd4b4d 100644 --- a/AY2324S2-CS2103T-T12-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T12-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"tcjazwei":[],"shunjieee":[],"ShanylOng":[],"ChuaZenKhoon":[{"date":"2024-03-08","commitResults":[{"hash":"cc609deba5427b6e531c6d8252edeacf873f29b7","isMergeCommit":false,"messageTitle":"Update DG: NFRs and Glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":4}}},{"hash":"0172451aca92a3249a803f9de70f78bf295c167b","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ChuaZenKhoon/v1.1-DG-NFRs-Glossary-update","messageBody":"Update DG: NFRs and Glossary","fileTypesAndContributionMap":{}},{"hash":"06ad7277c41e5ec816d78a42e9950d3e627ab467","isMergeCommit":false,"messageTitle":"Add individual details to AboutUs Page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"fcbc67dfe851964c6bbb543e509269a78d4ad319","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ChuaZenKhoon/v1.1-AboutUs-ZenKhoon","messageBody":"Add individual details to AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"b2bc1213053a8e0b809486615e1d81c909f2e2df","isMergeCommit":false,"messageTitle":"Add DG Use Case 2","messageBody":"For functionality of deletion of contact\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":14}}},{"hash":"50d7adf3f1bce6bec778d560d684b783efc32767","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZenKhoon/v1.1-DG-Use-Case-2","messageBody":"Add DG Use Case 2","fileTypesAndContributionMap":{}}]}],"ljy0422":[{"date":"2024-03-08","commitResults":[{"hash":"123d0cdf53ddcc392daba3346a0f515f6a1750e8","isMergeCommit":false,"messageTitle":"Add use case for the functionality of adding contacts","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":1}}},{"hash":"a9f63398b9e15af536ab6ce762fa0137625f15a9","isMergeCommit":true,"messageTitle":"Merge pull request #15 from ljy0422/v1.1-DG-User-Case-1","messageBody":"Add use case for the functionality of adding contacts","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"tcjazwei":{"docs":0,"functional-code":0,"test-code":0},"shunjieee":{"docs":0,"functional-code":0,"test-code":0},"ShanylOng":{"docs":0,"functional-code":0,"test-code":0},"ChuaZenKhoon":{"docs":26,"functional-code":0,"test-code":0},"ljy0422":{"docs":10,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tcjazwei":0.0,"shunjieee":0.0,"ShanylOng":0.0,"ChuaZenKhoon":155.55557,"ljy0422":27.44},"authorDisplayNameMap":{"tcjazwei":"CS2103T-T12-3 OLIV.. TAN","shunjieee":"CS2103T-T12-3 LEE .. JIE","ShanylOng":"CS2103T-T12-3 SHAN.. ONG","ChuaZenKhoon":"CS2103T-T12-3 CHUA..HOON","ljy0422":"CS2103T-T12-3 LIU ..AYAO"}} +{"authorDailyContributionsMap":{"tcjazwei":[{"date":"2024-03-09","commitResults":[{"hash":"c33591db79ef786a09f70fb9cc8c5518f29ec564","isMergeCommit":false,"messageTitle":"Target user profiles updated","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":2}}},{"hash":"416a810860c19adc0770e0a12038b71998f101b0","isMergeCommit":false,"messageTitle":"Update Value proposition and Target user profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-11","commitResults":[{"hash":"50e65b5db6641b27521acf279820859e667a37db","isMergeCommit":true,"messageTitle":"Merge pull request #18 from tcjazwei/master","messageBody":"v1.1-DG-Target-User-Profile-User-Stories-Value-Proposition","fileTypesAndContributionMap":{}}]}],"shunjieee":[],"ShanylOng":[],"ChuaZenKhoon":[{"date":"2024-03-08","commitResults":[{"hash":"cc609deba5427b6e531c6d8252edeacf873f29b7","isMergeCommit":false,"messageTitle":"Update DG: NFRs and Glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":4}}},{"hash":"0172451aca92a3249a803f9de70f78bf295c167b","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ChuaZenKhoon/v1.1-DG-NFRs-Glossary-update","messageBody":"Update DG: NFRs and Glossary","fileTypesAndContributionMap":{}},{"hash":"06ad7277c41e5ec816d78a42e9950d3e627ab467","isMergeCommit":false,"messageTitle":"Add individual details to AboutUs Page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"fcbc67dfe851964c6bbb543e509269a78d4ad319","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ChuaZenKhoon/v1.1-AboutUs-ZenKhoon","messageBody":"Add individual details to AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"b2bc1213053a8e0b809486615e1d81c909f2e2df","isMergeCommit":false,"messageTitle":"Add DG Use Case 2","messageBody":"For functionality of deletion of contact\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":14}}},{"hash":"50d7adf3f1bce6bec778d560d684b783efc32767","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZenKhoon/v1.1-DG-Use-Case-2","messageBody":"Add DG Use Case 2","fileTypesAndContributionMap":{}}]}],"ljy0422":[{"date":"2024-03-08","commitResults":[{"hash":"123d0cdf53ddcc392daba3346a0f515f6a1750e8","isMergeCommit":false,"messageTitle":"Add use case for the functionality of adding contacts","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":1}}},{"hash":"a9f63398b9e15af536ab6ce762fa0137625f15a9","isMergeCommit":true,"messageTitle":"Merge pull request #15 from ljy0422/v1.1-DG-User-Case-1","messageBody":"Add use case for the functionality of adding contacts","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"tcjazwei":{"docs":20,"functional-code":0,"test-code":0},"shunjieee":{"docs":0,"functional-code":0,"test-code":0},"ShanylOng":{"docs":0,"functional-code":0,"test-code":0},"ChuaZenKhoon":{"docs":26,"functional-code":0,"test-code":0},"ljy0422":{"docs":9,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tcjazwei":35.469135,"shunjieee":0.0,"ShanylOng":0.0,"ChuaZenKhoon":131.17284,"ljy0422":23.138891},"authorDisplayNameMap":{"tcjazwei":"CS2103T-T12-3 OLIV.. TAN","shunjieee":"CS2103T-T12-3 LEE .. JIE","ShanylOng":"CS2103T-T12-3 SHAN.. ONG","ChuaZenKhoon":"CS2103T-T12-3 CHUA..HOON","ljy0422":"CS2103T-T12-3 LIU ..AYAO"}} diff --git a/AY2324S2-CS2103T-T15-2_tp_master/authorship.json b/AY2324S2-CS2103T-T15-2_tp_master/authorship.json index a266a765..6b6695a9 100644 --- a/AY2324S2-CS2103T-T15-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T15-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"## Arona Pro","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"* This is **a sample project given to Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"* The project simulates an ongoing software project for a desktop application (called _AronaPro_) catered for","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" Computer Science teaching assistants who appreciate an organised and vibrant approach to query,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" and manage an array of students and professors’ contacts with CLI.","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Main features include:","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":"#### View Contact Information","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"Description: `View` command allows you to see all the existing contacts of your students","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `view`","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"#### Add New Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"Description: `Add` command allows you to add new contacts of your students into the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `id/NUSID n/NAME p/PHONE [e/EMAIL] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":"#### Edit Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"Description: `Edit` command allows you to edit existing contacts of your students in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `edit id/NUSID [n/NEWNAME] [p/NEWPHONE] [e/NEWEMAIL]`","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":"#### Delete Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"Description: `Delete` command allows you to delete existing contacts in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `delete id/NUSID`","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"#### Filtering Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"Description: `Filter` command allows you to filter desired contacts in the address book based on group ","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":"and tag specified","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `filter [n/NAME] [p/PHONE] [e/EMAIL] [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"#### Assign contacts a tutorial group","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":"Description: `Assign` command allows you to assign students into their respective tutorial groups in the ","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"address book","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `assign id/NUSID [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"#### Add Schedule","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"Description: `Schedyle` command allows you to schedule an appointment with students","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `schedule id/NUSID d/DATE from/FROM [to/TO] [t/TAG] [r/REMARK]`","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"cheahTJ":41,"hjuntan":1,"-":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Cheah Tze Juen","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/cheahtj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"[[github](https://github.com/cheahTJ)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/cheahtj.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"* Roles: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" * Dedicates tasks among team and facilitate coordination among team members","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"### Tan Hong Jun","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/hjuntan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/hjuntan)]","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/hjuntan.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all documentation are up-to-date and are specific to the user","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"### Loh Jin Hun","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":"\u003cimg src\u003d\"images/ragnapop.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Ragnapop)] [[portfolio](team/ragnapop.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all features are properly tested, even on edge cases","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"### Chen Kuan Min","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":"\u003cimg src\u003d\"images/rikko1204.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Rikko1204)]","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/rikko1204.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":"* Role: Scheduling and tracking","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is on pace with the 2 weeks sprint and helps assign","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" task equally to members","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":"### Guo Yuhao","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/ringoftheking.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/RingoftheKing)]","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/ringoftheking.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"cheahTJ"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":64,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is focussed on the individual task and is able to deliver the intended feature","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":31,"hjuntan":2,"-":32}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"hjuntan"},"content":"* Tech-savvy university Computer Science teaching assistants","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"hjuntan"},"content":"* manages an array of students and professors’ contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"hjuntan"},"content":"* appreciates an organized and vibrant approach to query, and manage contacts with CLI","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"RingoftheKing"},"content":"|----------|-------------------------------------------------------------------------------|--------------------------------------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | add a new student, prof, TA | know how to contact them |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | find a student by name or class | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | Group students into classes | know which class my student is in |","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching assistant | find my supervisor(s) | Report any admin issues my students would raise |","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | University student with different friend groups | Tag or categorize my contacts | Search by the friend groups I\u0027m concerned with |","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who wants to meet up with Profs and students | Schedule events to do so | remind myself to meet up or know my free times. |","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant with important people to report to or stay in contact with | pin important contacts | |","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who needs to announce information to his students | copy a (group of) student(s)\u0027 contact info onto my clipboard | announce a message efficiently to many students |","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Forgetful Teaching Assistant | A check for addition of duplicate contacts | can reduce clutter of my list |","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant who might mistype | Have a Confirm Delete warning when doing deletions | Provide a safety net in case I accidentally delete important info |","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant with many students | Personalize contacts with photos | Attribute names to faces and distinguish similar names. |","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"RingoftheKing"},"content":"| `*` | detail-oriented Teaching Assistant | Add a note with additional information about the contact | remind myself of things I may need to follow up on |","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant who tires from work | use an app with a cheerful interface | feel encouraged / at peace |","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant | import and export contact details to/from the app | can easily shift to using this app, or another |","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"RingoftheKing"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"Ragnapop"},"content":"**Use case: View all contacts**","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"Ragnapop"},"content":"1. User requests to view all contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook shows a list of contacts added.","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Ragnapop"},"content":"**Use case: Add a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Ragnapop"},"content":"1. User requests to add a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all information required to add a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook adds the contact with all relevant information into a list.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"Ragnapop"},"content":"* 2b. The given information is insufficient to form a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Ragnapop"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Ragnapop"},"content":"**Use case: Edit a contact\u0027s particulars**","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"Ragnapop"},"content":"1. User requests to edit a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all fields he wishes to edit about said contact,as well as the information required to edit a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook edits the contact by changing all the specified fields into the newly inputted information.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"Ragnapop"},"content":"**Use case: Delete a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"Ragnapop"},"content":"1. User requests to delete a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook deletes the specified contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"Ragnapop"},"content":"**Use case: Find a specific existing contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"Ragnapop"},"content":"1. User requests to find a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook outputs the contact with all relevant information about the contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":426,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":433,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"Ragnapop"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":436,"author":{"gitId":"Ragnapop"},"content":"**Use case: Assign an existing contact to a tutorial group**","lastModifiedDate":"2024-03-04"},{"lineNumber":437,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":438,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":439,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":440,"author":{"gitId":"Ragnapop"},"content":"1. User requests to tag a specific contact to a tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":441,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook tags the contact to the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":443,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":446,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":447,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":448,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":449,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":450,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":451,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":452,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":453,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":454,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":455,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":456,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":457,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":458,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tutorial group does not yet exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":459,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":460,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook creates a new tag with the name of the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":461,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":462,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":463,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":464,"author":{"gitId":"Ragnapop"},"content":"**Use case: Classify an existing contact (Prof, TA, Student)**","lastModifiedDate":"2024-03-04"},{"lineNumber":465,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":466,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":467,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":468,"author":{"gitId":"Ragnapop"},"content":"1. User requests to classify a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":469,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook classifies the contact as either a Professor, TA or Student.","lastModifiedDate":"2024-03-04"},{"lineNumber":470,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":471,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":472,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":473,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":474,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":475,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":476,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":477,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":478,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":479,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":480,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":481,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":482,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":483,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":484,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":485,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":486,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tag does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":487,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":488,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":489,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-04"},{"lineNumber":490,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":491,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":492,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":493,"author":{"gitId":"Ragnapop"},"content":"**Use case: schedules an event with a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":495,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"Ragnapop"},"content":"1. User requests to schedule an event with a specific contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all necessary information into AddressBook in order for the event to be scheduled.","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook creates the event and classifies it under the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":505,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":506,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":507,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":508,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":509,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"Ragnapop"},"content":"* 2a. The information required is not sufficiently inputted.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":519,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-06"},{"lineNumber":520,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":521,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":522,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"hjuntan"},"content":"4. A novice user should be able to learn basic operations (add, delete, search entries) within 30 minutes of using the documentation.","lastModifiedDate":"2024-03-05"},{"lineNumber":530,"author":{"gitId":"hjuntan"},"content":"5. The system should respond within two seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":531,"author":{"gitId":"hjuntan"},"content":"6. The system should be backward compatible with data produced by earlier versions of the system","lastModifiedDate":"2024-03-05"},{"lineNumber":532,"author":{"gitId":"hjuntan"},"content":"7. The system should smoothly handle user input errors and system issues, providing meaningful error messages without crashing.","lastModifiedDate":"2024-03-05"},{"lineNumber":533,"author":{"gitId":"hjuntan"},"content":"8. Comply with relevant data protection regulations, Personal Data Protection Act (PDPA) in handling personal information.","lastModifiedDate":"2024-03-05"},{"lineNumber":534,"author":{"gitId":"hjuntan"},"content":"9. Adhere to recommended coding standards, such as readability, modularity, and application of design patterns, to make upgrades and maintenance simpler.","lastModifiedDate":"2024-03-05"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"Rikko1204"},"content":"* **Teaching Assistant (TA)**: A student-tutor hired by NUS. TAs are responsible for conducting tutorial lessons and assist in the students\u0027 learning whenever required.","lastModifiedDate":"2024-03-06"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":547,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":548,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":549,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":578,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":579,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":580,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":581,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":582,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":583,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":584,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":585,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":586,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":587,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":592,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":1,"RingoftheKing":16,"Ragnapop":171,"hjuntan":9,"-":396}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"Rikko1204"},"content":"Format: `add id/ID n/NAME p/PHONE_NUMBER e/EMAIL [t/TAG]…​`","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"Rikko1204"},"content":"**Tip:** A person can have 0 or 1 tag","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"Rikko1204"},"content":"* `add id/E1234567 n/John Doe p/98765432 e/johnd@example.com`","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"Rikko1204"},"content":"* `add id/E7654321 n/Betsy Crowe t/student e/betsycrowe@example.com p/1234567`","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":166,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":171,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":192,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":4,"-":200}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"Rikko1204"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eAronaPro\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"Rikko1204":1,"-":66}},{"path":"docs/team/cheahtj.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Cheah Tze Juen\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/hjuntan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Tan Hong Jun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ragnapop.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Loh Jin Hun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/rikko1204.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Chen Kuan Min\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ringoftheking.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Guo YuHao Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"src/main/java/seedu/address/model/person/NusId.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":" * Represents a Person\u0027s Nusid in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidNusId(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"public class NusId {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"NusID is of the form EXXXXXXX, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * Ensures that the input nusid is of the form: EXXXXXXX","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" public static final String VALIDATION_REGEX \u003d \"^E\\\\d{7}$\\n\";","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":" * Constructs an {@code Nusid}.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":" * @param nusid A valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":" public NusId(String nusid) {","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":" requireNonNull(nusid);","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" checkArgument(isValidNusId(nusid), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" value \u003d nusid;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Returns true if a given string is a valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" public static boolean isValidNusId(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":" if (!(other instanceof NusId)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"cheahTJ"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" NusId otherNusid \u003d (NusId) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"cheahTJ"},"content":" return value.equals(otherNusid.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"cheahTJ":62}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"## Arona Pro","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"* This is **a sample project given to Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"* The project simulates an ongoing software project for a desktop application (called _AronaPro_) catered for","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" Computer Science teaching assistants who appreciate an organised and vibrant approach to query,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" and manage an array of students and professors’ contacts with CLI.","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Main features include:","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":"#### View Contact Information","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"Description: `View` command allows you to see all the existing contacts of your students","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `view`","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"#### Add New Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"Description: `Add` command allows you to add new contacts of your students into the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `id/NUSID n/NAME p/PHONE [e/EMAIL] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":"#### Edit Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"Description: `Edit` command allows you to edit existing contacts of your students in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `edit id/NUSID [n/NEWNAME] [p/NEWPHONE] [e/NEWEMAIL]`","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":"#### Delete Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"Description: `Delete` command allows you to delete existing contacts in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `delete id/NUSID`","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"#### Filtering Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"Description: `Filter` command allows you to filter desired contacts in the address book based on group ","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":"and tag specified","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `filter [n/NAME] [p/PHONE] [e/EMAIL] [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"#### Assign contacts a tutorial group","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":"Description: `Assign` command allows you to assign students into their respective tutorial groups in the ","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"address book","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `assign id/NUSID [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"#### Add Schedule","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"Description: `Schedyle` command allows you to schedule an appointment with students","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `schedule id/NUSID d/DATE from/FROM [to/TO] [t/TAG] [r/REMARK]`","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"cheahTJ":41,"hjuntan":1,"-":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Cheah Tze Juen","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/cheahtj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"[[github](https://github.com/cheahTJ)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/cheahtj.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"* Roles: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" * Dedicates tasks among team and facilitate coordination among team members","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"### Tan Hong Jun","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/hjuntan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/hjuntan)]","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/hjuntan.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all documentation are up-to-date and are specific to the user","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"### Loh Jin Hun","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":"\u003cimg src\u003d\"images/ragnapop.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Ragnapop)] [[portfolio](team/ragnapop.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all features are properly tested, even on edge cases","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"### Chen Kuan Min","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":"\u003cimg src\u003d\"images/rikko1204.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Rikko1204)]","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/rikko1204.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":"* Role: Scheduling and tracking","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is on pace with the 2 weeks sprint and helps assign","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" task equally to members","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":"### Guo Yuhao","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/ringoftheking.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/RingoftheKing)]","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/ringoftheking.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"cheahTJ"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":64,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is focussed on the individual task and is able to deliver the intended feature","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":31,"hjuntan":2,"-":32}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"hjuntan"},"content":"* Tech-savvy university Computer Science teaching assistants","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"hjuntan"},"content":"* manages an array of students and professors’ contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"hjuntan"},"content":"* appreciates an organized and vibrant approach to query, and manage contacts with CLI","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"RingoftheKing"},"content":"|----------|-------------------------------------------------------------------------------|--------------------------------------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | add a new student, prof, TA | know how to contact them |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | find a student by name or class | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | Group students into classes | know which class my student is in |","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching assistant | find my supervisor(s) | Report any admin issues my students would raise |","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | University student with different friend groups | Tag or categorize my contacts | Search by the friend groups I\u0027m concerned with |","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who wants to meet up with Profs and students | Schedule events to do so | remind myself to meet up or know my free times. |","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant with important people to report to or stay in contact with | pin important contacts | |","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who needs to announce information to his students | copy a (group of) student(s)\u0027 contact info onto my clipboard | announce a message efficiently to many students |","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Forgetful Teaching Assistant | A check for addition of duplicate contacts | can reduce clutter of my list |","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant who might mistype | Have a Confirm Delete warning when doing deletions | Provide a safety net in case I accidentally delete important info |","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant with many students | Personalize contacts with photos | Attribute names to faces and distinguish similar names. |","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"RingoftheKing"},"content":"| `*` | detail-oriented Teaching Assistant | Add a note with additional information about the contact | remind myself of things I may need to follow up on |","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant who tires from work | use an app with a cheerful interface | feel encouraged / at peace |","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant | import and export contact details to/from the app | can easily shift to using this app, or another |","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"RingoftheKing"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"Ragnapop"},"content":"**Use case: View all contacts**","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"Ragnapop"},"content":"1. User requests to view all contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook shows a list of contacts added.","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Ragnapop"},"content":"**Use case: Add a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Ragnapop"},"content":"1. User requests to add a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all information required to add a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook adds the contact with all relevant information into a list.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"Ragnapop"},"content":"* 2b. The given information is insufficient to form a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Ragnapop"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Ragnapop"},"content":"**Use case: Edit a contact\u0027s particulars**","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"Ragnapop"},"content":"1. User requests to edit a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all fields he wishes to edit about said contact,as well as the information required to edit a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook edits the contact by changing all the specified fields into the newly inputted information.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"Ragnapop"},"content":"**Use case: Delete a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"Ragnapop"},"content":"1. User requests to delete a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook deletes the specified contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"Ragnapop"},"content":"**Use case: Find a specific existing contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"Ragnapop"},"content":"1. User requests to find a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook outputs the contact with all relevant information about the contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":426,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":433,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"Ragnapop"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":436,"author":{"gitId":"Ragnapop"},"content":"**Use case: Assign an existing contact to a tutorial group**","lastModifiedDate":"2024-03-04"},{"lineNumber":437,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":438,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":439,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":440,"author":{"gitId":"Ragnapop"},"content":"1. User requests to tag a specific contact to a tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":441,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook tags the contact to the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":443,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":446,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":447,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":448,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":449,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":450,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":451,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":452,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":453,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":454,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":455,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":456,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":457,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":458,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tutorial group does not yet exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":459,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":460,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook creates a new tag with the name of the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":461,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":462,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":463,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":464,"author":{"gitId":"Ragnapop"},"content":"**Use case: Classify an existing contact (Prof, TA, Student)**","lastModifiedDate":"2024-03-04"},{"lineNumber":465,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":466,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":467,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":468,"author":{"gitId":"Ragnapop"},"content":"1. User requests to classify a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":469,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook classifies the contact as either a Professor, TA or Student.","lastModifiedDate":"2024-03-04"},{"lineNumber":470,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":471,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":472,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":473,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":474,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":475,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":476,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":477,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":478,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":479,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":480,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":481,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":482,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":483,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":484,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":485,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":486,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tag does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":487,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":488,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":489,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-04"},{"lineNumber":490,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":491,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":492,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":493,"author":{"gitId":"Ragnapop"},"content":"**Use case: schedules an event with a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":495,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"Ragnapop"},"content":"1. User requests to schedule an event with a specific contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all necessary information into AddressBook in order for the event to be scheduled.","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook creates the event and classifies it under the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":505,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":506,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":507,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":508,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":509,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"Ragnapop"},"content":"* 2a. The information required is not sufficiently inputted.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":519,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-06"},{"lineNumber":520,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":521,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":522,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"hjuntan"},"content":"4. A novice user should be able to learn basic operations (add, delete, search entries) within 30 minutes of using the documentation.","lastModifiedDate":"2024-03-05"},{"lineNumber":530,"author":{"gitId":"hjuntan"},"content":"5. The system should respond within two seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":531,"author":{"gitId":"hjuntan"},"content":"6. The system should be backward compatible with data produced by earlier versions of the system","lastModifiedDate":"2024-03-05"},{"lineNumber":532,"author":{"gitId":"hjuntan"},"content":"7. The system should smoothly handle user input errors and system issues, providing meaningful error messages without crashing.","lastModifiedDate":"2024-03-05"},{"lineNumber":533,"author":{"gitId":"hjuntan"},"content":"8. Comply with relevant data protection regulations, Personal Data Protection Act (PDPA) in handling personal information.","lastModifiedDate":"2024-03-05"},{"lineNumber":534,"author":{"gitId":"hjuntan"},"content":"9. Adhere to recommended coding standards, such as readability, modularity, and application of design patterns, to make upgrades and maintenance simpler.","lastModifiedDate":"2024-03-05"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"Rikko1204"},"content":"* **Teaching Assistant (TA)**: A student-tutor hired by NUS. TAs are responsible for conducting tutorial lessons and assist in the students\u0027 learning whenever required.","lastModifiedDate":"2024-03-06"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":547,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":548,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":549,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":578,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":579,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":580,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":581,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":582,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":583,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":584,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":585,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":586,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":587,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":592,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":1,"RingoftheKing":16,"Ragnapop":171,"hjuntan":9,"-":396}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"Rikko1204"},"content":"Format: `add id/ID n/NAME p/PHONE_NUMBER e/EMAIL [t/TAG]…​`","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"Rikko1204"},"content":"**Tip:** A person can have 0 or 1 tag","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"Rikko1204"},"content":"* `add id/E1234567 n/John Doe p/98765432 e/johnd@example.com`","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"Rikko1204"},"content":"* `add id/E7654321 n/Betsy Crowe t/student e/betsycrowe@example.com p/1234567`","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":166,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":171,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":192,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":4,"-":200}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"Rikko1204"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eAronaPro\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"Rikko1204":1,"-":66}},{"path":"docs/team/cheahtj.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Cheah Tze Juen\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/hjuntan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Tan Hong Jun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ragnapop.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Loh Jin Hun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/rikko1204.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Chen Kuan Min\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ringoftheking.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Guo YuHao Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"src/main/java/seedu/address/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2023-07-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.Prefix;","lastModifiedDate":"2023-07-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" .append(\"; Tag: \")","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" .append(person.getTag())","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":" .append(\"; Groups: \");","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" person.getGroups().forEach(builder::append);","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"hjuntan":4,"-":47}},{"path":"src/main/java/seedu/address/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" + PREFIX_TAG + \"TAG \"","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" + \"[\" + PREFIX_GROUP + \"GROUP]...\\n\"","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" + PREFIX_TAG + \"Student \"","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" + PREFIX_GROUP + \"friends \"","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":" + PREFIX_GROUP + \"owesMoney\";","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"hjuntan":6,"-":78}},{"path":"src/main/java/seedu/address/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-12-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2016-12-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2016-12-26"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.NusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2016-12-26"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":" + \"[\" + PREFIX_TAG + \"TAG] \"","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" + \"[\" + PREFIX_GROUP + \"GROUP]...\\n\"","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":65,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":68,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":74,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":88,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":99,"author":{"gitId":"hjuntan"},"content":" NusId nusId \u003d personToEdit.getNusId(); // nusId is immutable","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":103,"author":{"gitId":"hjuntan"},"content":" Tag updatedTag \u003d editPersonDescriptor.getTag().orElse(personToEdit.getTag());","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"hjuntan"},"content":" Set\u003cGroup\u003e updatedGroups \u003d editPersonDescriptor.getGroups().orElse(personToEdit.getGroups());","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":106,"author":{"gitId":"hjuntan"},"content":" return new Person(nusId, updatedName, updatedPhone, updatedEmail, updatedTag, updatedGroups);","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":138,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":140,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":141,"author":{"gitId":"hjuntan"},"content":" private Tag tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":142,"author":{"gitId":"hjuntan"},"content":" private Set\u003cGroup\u003e groups;","lastModifiedDate":"2024-03-11"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":144,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":146,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":148,"author":{"gitId":"hjuntan"},"content":" * A defensive copy of {@code groups} is used internally.","lastModifiedDate":"2024-03-11"},{"lineNumber":149,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":151,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":153,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":154,"author":{"gitId":"hjuntan"},"content":" setTag(toCopy.tag);","lastModifiedDate":"2024-03-11"},{"lineNumber":155,"author":{"gitId":"hjuntan"},"content":" setGroups(toCopy.groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":161,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":162,"author":{"gitId":"hjuntan"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, tag, groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":165,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":166,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":167,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":169,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":170,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":174,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":178,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":181,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":182,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":183,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":189,"author":{"gitId":"hjuntan"},"content":" public void setTag(Tag tag) {","lastModifiedDate":"2024-03-11"},{"lineNumber":190,"author":{"gitId":"hjuntan"},"content":" this.tag \u003d tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"hjuntan"},"content":" public Optional\u003cTag\u003e getTag() {","lastModifiedDate":"2024-03-11"},{"lineNumber":194,"author":{"gitId":"hjuntan"},"content":" return Optional.ofNullable(tag);","lastModifiedDate":"2024-03-11"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":197,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":198,"author":{"gitId":"hjuntan"},"content":" * Sets {@code groups} to this object\u0027s {@code groups}.","lastModifiedDate":"2024-03-11"},{"lineNumber":199,"author":{"gitId":"hjuntan"},"content":" * A defensive copy of {@code groups} is used internally.","lastModifiedDate":"2024-03-11"},{"lineNumber":200,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":201,"author":{"gitId":"hjuntan"},"content":" public void setGroups(Set\u003cGroup\u003e groups) {","lastModifiedDate":"2024-03-11"},{"lineNumber":202,"author":{"gitId":"hjuntan"},"content":" this.groups \u003d (groups !\u003d null) ? new HashSet\u003c\u003e(groups) : null;","lastModifiedDate":"2024-03-11"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":205,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":206,"author":{"gitId":"hjuntan"},"content":" * Returns an unmodifiable group set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2024-03-11"},{"lineNumber":207,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":208,"author":{"gitId":"hjuntan"},"content":" * Returns {@code Optional#empty()} if {@code groups} is null.","lastModifiedDate":"2024-03-11"},{"lineNumber":209,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":210,"author":{"gitId":"hjuntan"},"content":" public Optional\u003cSet\u003cGroup\u003e\u003e getGroups() {","lastModifiedDate":"2024-03-11"},{"lineNumber":211,"author":{"gitId":"hjuntan"},"content":" return (groups !\u003d null) ? Optional.of(Collections.unmodifiableSet(groups)) : Optional.empty();","lastModifiedDate":"2024-03-11"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":214,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":215,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":216,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":217,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":220,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":221,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":222,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":223,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":225,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":226,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":227,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":228,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":229,"author":{"gitId":"hjuntan"},"content":" \u0026\u0026 Objects.equals(tag, otherEditPersonDescriptor.tag)","lastModifiedDate":"2024-03-11"},{"lineNumber":230,"author":{"gitId":"hjuntan"},"content":" \u0026\u0026 Objects.equals(groups, otherEditPersonDescriptor.groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":239,"author":{"gitId":"hjuntan"},"content":" .add(\"tag\", tag)","lastModifiedDate":"2024-03-11"},{"lineNumber":240,"author":{"gitId":"hjuntan"},"content":" .add(\"groups\", groups)","lastModifiedDate":"2024-03-11"},{"lineNumber":241,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":244,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"hjuntan":32,"-":212}},{"path":"src/main/java/seedu/address/logic/commands/exceptions/CommandException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands.exceptions;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"hjuntan"},"content":"import seedu.address.logic.commands.Command;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Represents an error which occurs during execution of a {@link Command}.","lastModifiedDate":"2017-02-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class CommandException extends Exception {","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public CommandException(String message) {","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":" super(message);","lastModifiedDate":"2017-02-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Constructs a new {@code CommandException} with the specified detail {@code message} and {@code cause}.","lastModifiedDate":"2018-08-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public CommandException(String message, Throwable cause) {","lastModifiedDate":"2018-08-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":" super(message, cause);","lastModifiedDate":"2018-08-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"hjuntan":2,"-":17}},{"path":"src/main/java/seedu/address/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-02-05"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-02-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-03-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-03-17"},{"lineNumber":18,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.NusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-03-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-03-17"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG, PREFIX_GROUP);","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_TAG, PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" NusId nusId \u003d new NusId(\"E0123456\"); // dummy nusId","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG);","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":48,"author":{"gitId":"hjuntan"},"content":" Tag tag \u003d ParserUtil.parseTag(argMultimap.getValue(PREFIX_TAG).get());","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":" Set\u003cGroup\u003e groupList \u003d ParserUtil.parseGroups(argMultimap.getAllValues(PREFIX_GROUP));","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":" Person person \u003d new Person(nusId, name, phone, email, tag, groupList);","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"hjuntan":12,"-":52}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":" public static final Prefix PREFIX_GROUP \u003d new Prefix(\"g/\");","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"hjuntan":1,"-":14}},{"path":"src/main/java/seedu/address/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG, PREFIX_GROUP);","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":42,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG);","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" if (argMultimap.getValue(PREFIX_TAG).isPresent()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" editPersonDescriptor.setTag(ParserUtil.parseTag(argMultimap.getValue(PREFIX_TAG).get()));","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":" parseGroupsForEdit(argMultimap.getAllValues(PREFIX_GROUP)).ifPresent(editPersonDescriptor::setGroups);","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"hjuntan"},"content":" * Parses {@code Collection\u003cString\u003e groups} into a {@code Set\u003cGroup\u003e} if {@code groups} is non-empty.","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"hjuntan"},"content":" * If {@code groups} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"hjuntan"},"content":" * {@code Set\u003cGroup\u003e} containing zero groups.","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":75,"author":{"gitId":"hjuntan"},"content":" private Optional\u003cSet\u003cGroup\u003e\u003e parseGroupsForEdit(Collection\u003cString\u003e groups) throws ParseException {","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"hjuntan"},"content":" assert groups !\u003d null;","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"hjuntan"},"content":" if (groups.isEmpty()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"hjuntan"},"content":" Collection\u003cString\u003e groupSet \u003d groups.size() \u003d\u003d 1 \u0026\u0026 groups.contains(\"\") ? Collections.emptySet() : groups;","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"hjuntan"},"content":" return Optional.of(ParserUtil.parseGroups(groupSet));","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"hjuntan":15,"-":70}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":33,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":48,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":61,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":69,"author":{"gitId":"hjuntan"},"content":" * Parses a {@code String tag} into an {@code Tag}.","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"hjuntan"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":74,"author":{"gitId":"hjuntan"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"hjuntan"},"content":" requireNonNull(tag);","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"hjuntan"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"hjuntan"},"content":" if (!Tag.isValidTag(trimmedTag)) {","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"hjuntan"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":80,"author":{"gitId":"hjuntan"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":86,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":91,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"hjuntan"},"content":" * Parses a {@code String group} into a {@code Group}.","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"hjuntan"},"content":" * @throws ParseException if the given {@code group} is invalid.","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"hjuntan"},"content":" public static Group parseGroup(String group) throws ParseException {","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"hjuntan"},"content":" requireNonNull(group);","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"hjuntan"},"content":" String trimmedGroup \u003d group.trim();","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"hjuntan"},"content":" if (!Group.isValidGroupName(trimmedGroup)) {","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"hjuntan"},"content":" throw new ParseException(Group.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"hjuntan"},"content":" return new Group(trimmedGroup);","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":114,"author":{"gitId":"hjuntan"},"content":" * Parses {@code Collection\u003cString\u003e groups} into a {@code Set\u003cGroup\u003e}.","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":116,"author":{"gitId":"hjuntan"},"content":" public static Set\u003cGroup\u003e parseGroups(Collection\u003cString\u003e groups) throws ParseException {","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"hjuntan"},"content":" requireNonNull(groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"hjuntan"},"content":" final Set\u003cGroup\u003e groupSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"hjuntan"},"content":" for (String groupName : groups) {","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"hjuntan"},"content":" groupSet.add(parseGroup(groupName));","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":122,"author":{"gitId":"hjuntan"},"content":" return groupSet;","lastModifiedDate":"2024-03-11"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"hjuntan":25,"-":99}},{"path":"src/main/java/seedu/address/model/group/Group.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"package seedu.address.model.group;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"hjuntan"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"/**","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":" * Represents a Group in the address book.","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"hjuntan"},"content":" * Guarantees: immutable; name is valid as declared in {@link #isValidGroupName(String)}","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"hjuntan"},"content":"public class Group {","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Group names should be alphanumeric\";","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\p{Alnum}+\";","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"hjuntan"},"content":" public final String groupName;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"hjuntan"},"content":" * Constructs a {@code Group}.","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":" *","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":" * @param groupName A valid group name.","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"hjuntan"},"content":" public Group(String groupName) {","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"hjuntan"},"content":" requireNonNull(groupName);","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" checkArgument(isValidGroupName(groupName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"hjuntan"},"content":" this.groupName \u003d groupName;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" * Returns true if a given string is a valid group name.","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" public static boolean isValidGroupName(String test) {","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" @Override","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" return true;","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" if (!(other instanceof Group)) {","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":" return false;","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":" Group otherGroup \u003d (Group) other;","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" return groupName.equals(otherGroup.groupName);","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"hjuntan"},"content":" @Override","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"hjuntan"},"content":" return groupName.hashCode();","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"hjuntan"},"content":" * Format state as text for viewing.","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" public String toString() {","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" return \u0027[\u0027 + groupName + \u0027]\u0027;","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"hjuntan"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"hjuntan":62}},{"path":"src/main/java/seedu/address/model/person/NusId.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":" * Represents a Person\u0027s Nusid in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidNusId(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"public class NusId {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"NusID is of the form EXXXXXXX, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * Ensures that the input nusid is of the form: EXXXXXXX","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":" public static final String VALIDATION_REGEX \u003d \"^E\\\\d{7}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":" * Constructs an {@code Nusid}.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":" * @param nusid A valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":" public NusId(String nusid) {","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":" requireNonNull(nusid);","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" checkArgument(isValidNusId(nusid), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" value \u003d nusid;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Returns true if a given string is a valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" public static boolean isValidNusId(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":" if (!(other instanceof NusId)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"cheahTJ"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" NusId otherNusid \u003d (NusId) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"cheahTJ"},"content":" return value.equals(otherNusid.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"cheahTJ":61,"hjuntan":1}},{"path":"src/main/java/seedu/address/model/person/Person.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":" private final NusId nusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":" private final Tag tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":" private final Set\u003cGroup\u003e groups \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" public Person(NusId nusId, Name name, Phone phone, Email email, Tag tag, Set\u003cGroup\u003e groups) {","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" requireAllNonNull(nusId, name, phone, email, tag, groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" this.nusId \u003d nusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" this.tag \u003d tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" this.groups.addAll(groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"hjuntan"},"content":" public Tag getTag() {","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"hjuntan"},"content":" return tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" public NusId getNusId() {","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" return nusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":63,"author":{"gitId":"hjuntan"},"content":" * Returns an immutable group set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":66,"author":{"gitId":"hjuntan"},"content":" public Set\u003cGroup\u003e getGroups() {","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"hjuntan"},"content":" return Collections.unmodifiableSet(groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":95,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":99,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":102,"author":{"gitId":"hjuntan"},"content":" \u0026\u0026 tag.equals(otherPerson.tag)","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"hjuntan"},"content":" \u0026\u0026 groups.equals(otherPerson.groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":109,"author":{"gitId":"hjuntan"},"content":" return Objects.hash(name, phone, email, tag, groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":115,"author":{"gitId":"hjuntan"},"content":" .add(\"nusId\", nusId)","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":119,"author":{"gitId":"hjuntan"},"content":" .add(\"tag\", tag)","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"hjuntan"},"content":" .add(\"groups\", groups)","lastModifiedDate":"2024-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"hjuntan":22,"-":102}},{"path":"src/main/java/seedu/address/model/person/Tag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"hjuntan"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"/**","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":" * Represents a Person\u0027s tag in the address book.","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"hjuntan"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidTag(String)}","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"hjuntan"},"content":"public class Tag {","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":" * Represents the type of tag.","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"hjuntan"},"content":" public enum TagType {","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":" Professor, TA, Student, None;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":" * Returns the string representation of the tag type.","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":" * @param tagType","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":" * @return","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"hjuntan"},"content":" public static String toString(TagType tagType) {","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" switch (tagType) {","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"hjuntan"},"content":" case Professor:","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":" return \"Professor\";","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":" case TA:","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" return \"TA\";","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" case Student:","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":" return \"Student\";","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" default:","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" return \"None\";","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Tag can only these values: Professor, TA, Student, None\";","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" public final TagType value;","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" * Constructs an {@code Tag}.","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":" *","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" * @param tag A valid tag.","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":" public Tag(String tag) {","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" requireNonNull(tag);","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"hjuntan"},"content":" checkArgument(isValidTag(tag), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":" value \u003d parseTag(tag);","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" * Parses a tag and returns the corresponding TagType.","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"hjuntan"},"content":" * @param tag","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"hjuntan"},"content":" * @return","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" public static TagType parseTag(String tag) {","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" switch (tag) {","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" case \"Professor\":","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"hjuntan"},"content":" return TagType.Professor;","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":" case \"TA\":","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"hjuntan"},"content":" return TagType.TA;","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"hjuntan"},"content":" case \"Student\":","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"hjuntan"},"content":" return TagType.Student;","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"hjuntan"},"content":" default:","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"hjuntan"},"content":" return TagType.None;","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"hjuntan"},"content":" * Returns true if a given string is a valid tag.","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"hjuntan"},"content":" public static boolean isValidTag(String test) {","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"hjuntan"},"content":" switch (test) {","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"hjuntan"},"content":" case \"Professor\":","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"hjuntan"},"content":" case \"TA\":","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"hjuntan"},"content":" case \"Student\":","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"hjuntan"},"content":" case \"None\":","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"hjuntan"},"content":" return true;","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"hjuntan"},"content":" default:","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"hjuntan"},"content":" return false;","lastModifiedDate":"2024-03-11"},{"lineNumber":82,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":84,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"hjuntan"},"content":" @Override","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"hjuntan"},"content":" public String toString() {","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"hjuntan"},"content":" switch (value) {","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"hjuntan"},"content":" case Professor:","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"hjuntan"},"content":" return \"Professor\";","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"hjuntan"},"content":" case TA:","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"hjuntan"},"content":" return \"TA\";","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"hjuntan"},"content":" case Student:","lastModifiedDate":"2024-03-11"},{"lineNumber":93,"author":{"gitId":"hjuntan"},"content":" return \"Student\";","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"hjuntan"},"content":" default:","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"hjuntan"},"content":" return \"None\";","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"hjuntan"},"content":" @Override","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"hjuntan"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"hjuntan"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"hjuntan"},"content":" return true;","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":105,"author":{"gitId":"hjuntan"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"hjuntan"},"content":" if (!(other instanceof Tag)) {","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"hjuntan"},"content":" return false;","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"hjuntan"},"content":" Tag otherTag \u003d (Tag) other;","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"hjuntan"},"content":" return value.equals(otherTag.value);","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"hjuntan"},"content":" @Override","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"hjuntan"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"hjuntan"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"hjuntan"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"hjuntan":119}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2016-12-20"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2016-12-20"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.NusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2016-12-20"},{"lineNumber":15,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":" public static final NusId SAMPLE_NUSID \u003d new NusId(\"E1234567\");","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" new Person(SAMPLE_NUSID, new Name(\"Alex Yeoh\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"hjuntan"},"content":" new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":" new Tag(\"Student\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":" getGroupSet(\"friends\")),","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" new Person(SAMPLE_NUSID, new Name(\"Bernice Yu\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":" new Tag(\"Student\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" getGroupSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" new Person(SAMPLE_NUSID, new Name(\"Charlotte Oliveiro\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" new Tag(\"TA\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" getGroupSet(\"neighbours\")),","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":" new Person(SAMPLE_NUSID, new Name(\"David Li\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" new Tag(\"Professor\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" getGroupSet(\"family\")),","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":" new Person(SAMPLE_NUSID, new Name(\"Irfan Ibrahim\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" new Tag(\"TA\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":" getGroupSet(\"classmates\")),","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" new Person(SAMPLE_NUSID, new Name(\"Roy Balakrishnan\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":" new Tag(\"None\"),","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" getGroupSet(\"colleagues\"))","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"hjuntan"},"content":" * Returns a group set containing the list of strings given.","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":62,"author":{"gitId":"hjuntan"},"content":" public static Set\u003cGroup\u003e getGroupSet(String... strings) {","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":64,"author":{"gitId":"hjuntan"},"content":" .map(Group::new)","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"hjuntan":31,"-":37}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedGroup.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"package seedu.address.storage;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"hjuntan"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"hjuntan"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"/**","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"hjuntan"},"content":" * Jackson-friendly version of {@link Group}.","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":"class JsonAdaptedGroup {","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"hjuntan"},"content":" private final String groupName;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":" * Constructs a {@code JsonAdaptedGroup} with the given {@code groupName}.","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":" @JsonCreator","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":" public JsonAdaptedGroup(String groupName) {","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":" this.groupName \u003d groupName;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"hjuntan"},"content":" * Converts a given {@code Group} into this class for Jackson use.","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":" public JsonAdaptedGroup(Group source) {","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" groupName \u003d source.groupName;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" @JsonValue","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" public String getGroupName() {","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" return groupName;","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" * Converts this Jackson-friendly adapted group object into the model\u0027s {@code Group} object.","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" *","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted group.","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" public Group toModelType() throws IllegalValueException {","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" if (!Group.isValidGroupName(groupName)) {","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":" throw new IllegalValueException(Group.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" return new Group(groupName);","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"hjuntan"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"hjuntan":48}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.NusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" private final String nusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" private final String tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" private final List\u003cJsonAdaptedGroup\u003e groups \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" public JsonAdaptedPerson(@JsonProperty(\"nusId\") String nusId,","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":" @JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"tag\") String tag,","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" @JsonProperty(\"groups\") List\u003cJsonAdaptedGroup\u003e groups) {","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":" this.nusId \u003d nusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" this.tag \u003d tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"hjuntan"},"content":" if (groups !\u003d null) {","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":" this.groups.addAll(groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" nusId \u003d source.getNusId().value;","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":" tag \u003d source.getTag().value.toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"hjuntan"},"content":" groups.addAll(source.getGroups().stream()","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"hjuntan"},"content":" .map(JsonAdaptedGroup::new)","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"hjuntan"},"content":" final List\u003cGroup\u003e personGroups \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2024-03-11"},{"lineNumber":74,"author":{"gitId":"hjuntan"},"content":" for (JsonAdaptedGroup group : groups) {","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"hjuntan"},"content":" personGroups.add(group.toModelType());","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"hjuntan"},"content":" if (tag \u003d\u003d null) {","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"hjuntan"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Tag.class.getSimpleName()));","lastModifiedDate":"2024-03-11"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"hjuntan"},"content":" if (!Tag.isValidTag(tag)) {","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"hjuntan"},"content":" throw new IllegalValueException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"hjuntan"},"content":" final Tag modelTag \u003d new Tag(tag);","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"hjuntan"},"content":" if (nusId \u003d\u003d null) {","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"hjuntan"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, NusId.class.getSimpleName()));","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"hjuntan"},"content":" if (!NusId.isValidNusId(nusId)) {","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"hjuntan"},"content":" throw new IllegalValueException(NusId.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":116,"author":{"gitId":"hjuntan"},"content":" final NusId modelNusId \u003d new NusId(nusId);","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"hjuntan"},"content":" final Set\u003cGroup\u003e modelGroups \u003d new HashSet\u003c\u003e(personGroups);","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"hjuntan"},"content":" return new Person(modelNusId, modelName, modelPhone, modelEmail, modelTag, modelGroups);","lastModifiedDate":"2024-03-11"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"hjuntan":36,"-":86}},{"path":"src/main/java/seedu/address/ui/PersonCard.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.ui;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Comparator;","lastModifiedDate":"2019-01-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-01-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.FlowPane;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2016-09-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see \u003ca href\u003d\"https://github.com/se-edu/addressbook-level4/issues/336\"\u003eThe issue on AddressBook level 4\u003c/a\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" private Label tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" private Label nusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":" @FXML","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" private FlowPane groups;","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" nusId.setText(person.getNusId().value);","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":" name.setText(person.getName().fullName);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" phone.setText(person.getPhone().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":56,"author":{"gitId":"hjuntan"},"content":" tag.setText(person.getTag().value.toString());","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" email.setText(person.getEmail().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" person.getGroups().stream()","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" .sorted(Comparator.comparing(group -\u003e group.groupName))","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"hjuntan"},"content":" .forEach(group -\u003e groups.getChildren().add(new Label(group.groupName)));","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"hjuntan":9,"-":53}},{"path":"src/main/resources/view/PersonListCard.fxml","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cHBox id\u003d\"cardPane\" fx:id\u003d\"cardPane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2023-07-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cpadding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2017-03-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003c/padding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/Label\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" \u003cLabel fx:id\u003d\"nusId\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2016-09-03"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" \u003cFlowPane fx:id\u003d\"groups\" /\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" \u003cLabel fx:id\u003d\"tag\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$tag\" /\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"hjuntan":3,"-":34}},{"path":"src/test/java/seedu/address/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2016-09-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-06-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":137,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":138,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":155,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":156,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":159,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":168,"author":{"gitId":"-"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"hjuntan"},"content":" + EMAIL_DESC_AMY + TAG_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":170,"author":{"gitId":"hjuntan"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withGroups().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":171,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"hjuntan":3,"-":172}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" public static final String VALID_NUSID_AMY \u003d \"E1234567\";","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":" public static final String VALID_NUSID_BOB \u003d \"E7654321\";","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" public static final String VALID_TAG_AMY \u003d \"Student\";","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" public static final String VALID_TAG_BOB \u003d \"Professor\";","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" public static final String VALID_GROUP_HUSBAND \u003d \"husband\";","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":" public static final String VALID_GROUP_FRIEND \u003d \"friend\";","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":48,"author":{"gitId":"hjuntan"},"content":" public static final String TAG_DESC_AMY \u003d \" \" + PREFIX_TAG + VALID_TAG_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":" public static final String TAG_DESC_BOB \u003d \" \" + PREFIX_TAG + VALID_TAG_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"hjuntan"},"content":" public static final String GROUP_DESC_FRIEND \u003d \" \" + PREFIX_GROUP + VALID_GROUP_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":" public static final String GROUP_DESC_HUSBAND \u003d \" \" + PREFIX_GROUP + VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final String INVALID_NAME_DESC \u003d \" \" + PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2017-07-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \" + PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2017-07-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-07-05"},{"lineNumber":56,"author":{"gitId":"hjuntan"},"content":" public static final String INVALID_TAG_DESC \u003d \" \" + PREFIX_TAG; // empty string not allowed for tags","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" public static final String INVALID_GROUP_DESC \u003d \" \" + PREFIX_GROUP + \"hubby*\"; // \u0027*\u0027 not allowed in groups","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":67,"author":{"gitId":"hjuntan"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withTag(VALID_TAG_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"hjuntan"},"content":" .withGroups(VALID_GROUP_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":70,"author":{"gitId":"hjuntan"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withTag(VALID_TAG_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"hjuntan"},"content":" .withGroups(VALID_GROUP_HUSBAND, VALID_GROUP_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":81,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":107,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":109,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":113,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":125,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"hjuntan":17,"-":113}},{"path":"src/test/java/seedu/address/logic/commands/EditCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2018-01-31"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for EditCommand.","lastModifiedDate":"2020-12-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"public class EditCommandTest {","lastModifiedDate":"2017-05-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void execute_allFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(editedPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_someFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Index indexLastPerson \u003d Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Person lastPerson \u003d model.getFilteredPersonList().get(indexLastPerson.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":57,"author":{"gitId":"-"},"content":" PersonBuilder personInList \u003d new PersonBuilder(lastPerson);","lastModifiedDate":"2017-05-18"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person editedPerson \u003d personInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" .withGroups(VALID_GROUP_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":62,"author":{"gitId":"hjuntan"},"content":" .withPhone(VALID_PHONE_BOB).withGroups(VALID_GROUP_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(indexLastPerson, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":65,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":67,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":68,"author":{"gitId":"-"},"content":" expectedModel.setPerson(lastPerson, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void execute_noFieldSpecifiedUnfilteredList_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":75,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON, new EditPersonDescriptor());","lastModifiedDate":"2018-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Person editedPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void execute_filteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Person personInFilteredList \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder(personInFilteredList).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2018-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Person firstPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(firstPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_SECOND_PERSON, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-01-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":113,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // edit person in filtered list into a duplicate in address book","lastModifiedDate":"2017-05-18"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":117,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2018-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder(personInList).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2019-01-25"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":125,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-05-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex, descriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-18"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Edit filtered list where index is larger than size of filtered list,","lastModifiedDate":"2017-05-18"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * but smaller than size of address book","lastModifiedDate":"2017-05-18"},{"lineNumber":135,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-18"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":138,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-18"},{"lineNumber":140,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-05-18"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":143,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(outOfBoundIndex,","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":151,"author":{"gitId":"-"},"content":" final EditCommand standardCommand \u003d new EditCommand(INDEX_FIRST_PERSON, DESC_AMY);","lastModifiedDate":"2018-08-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":" EditPersonDescriptor copyDescriptor \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-08"},{"lineNumber":155,"author":{"gitId":"-"},"content":" EditCommand commandWithSameValues \u003d new EditCommand(INDEX_FIRST_PERSON, copyDescriptor);","lastModifiedDate":"2018-08-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(commandWithSameValues));","lastModifiedDate":"2017-05-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":159,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(standardCommand));","lastModifiedDate":"2017-05-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(null));","lastModifiedDate":"2017-05-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new ClearCommand()));","lastModifiedDate":"2017-05-08"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":168,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new EditCommand(INDEX_SECOND_PERSON, DESC_AMY)));","lastModifiedDate":"2017-05-25"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":" // different descriptor -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new EditCommand(INDEX_FIRST_PERSON, DESC_BOB)));","lastModifiedDate":"2017-05-25"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" EditCommand editCommand \u003d new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2019-02-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" String expected \u003d EditCommand.class.getCanonicalName() + \"{index\u003d\" + index + \", editPersonDescriptor\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" + editPersonDescriptor + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertEquals(expected, editCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-08"}],"authorContributionMap":{"hjuntan":3,"-":181}},{"path":"src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":" // different tag -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"hjuntan"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTag(VALID_TAG_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"hjuntan"},"content":" // different groups -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"hjuntan"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withGroups(VALID_GROUP_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getName().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"hjuntan"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", tag\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":67,"author":{"gitId":"hjuntan"},"content":" + editPersonDescriptor.getTag().orElse(null) + \", groups\u003d\"","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"hjuntan"},"content":" + editPersonDescriptor.getGroups().orElse(null) + \"}\";","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"hjuntan":9,"-":62}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.GROUP_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.GROUP_DESC_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_GROUP_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2017-12-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2017-12-23"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":22,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2017-06-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withGroups(VALID_GROUP_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" + TAG_DESC_BOB + GROUP_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":60,"author":{"gitId":"hjuntan"},"content":" // multiple groups - all accepted","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":" Person expectedPersonMultipleGroups \u003d new PersonBuilder(BOB).withGroups(VALID_GROUP_FRIEND, VALID_GROUP_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"hjuntan"},"content":" NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_BOB + GROUP_DESC_HUSBAND + GROUP_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"hjuntan"},"content":" new AddCommand(expectedPersonMultipleGroups));","lastModifiedDate":"2024-03-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"hjuntan"},"content":" public void parse_repeatedNonGroupValue_failure() {","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"-"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"hjuntan"},"content":" + TAG_DESC_BOB + GROUP_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"hjuntan"},"content":" // multiple tags","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, TAG_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":87,"author":{"gitId":"hjuntan"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_TAG));","lastModifiedDate":"2024-03-11"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"hjuntan"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY + TAG_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"-"},"content":" + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"hjuntan"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_TAG, PREFIX_EMAIL, PREFIX_PHONE));","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":109,"author":{"gitId":"hjuntan"},"content":" // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, INVALID_TAG_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-11"},{"lineNumber":111,"author":{"gitId":"hjuntan"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_TAG));","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"hjuntan"},"content":" // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":128,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_TAG_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":129,"author":{"gitId":"hjuntan"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_TAG));","lastModifiedDate":"2024-03-11"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":134,"author":{"gitId":"hjuntan"},"content":" // zero groups","lastModifiedDate":"2024-03-11"},{"lineNumber":135,"author":{"gitId":"hjuntan"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withGroups().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":136,"author":{"gitId":"hjuntan"},"content":" assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_AMY,","lastModifiedDate":"2024-03-11"},{"lineNumber":137,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":141,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":142,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":145,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":146,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":149,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + TAG_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":150,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":153,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + TAG_DESC_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":154,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"hjuntan"},"content":" // missing tag prefix","lastModifiedDate":"2024-03-11"},{"lineNumber":157,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_TAG_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":158,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":161,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_TAG_BOB,","lastModifiedDate":"2024-03-11"},{"lineNumber":162,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":168,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":169,"author":{"gitId":"hjuntan"},"content":" + GROUP_DESC_HUSBAND + GROUP_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":172,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + TAG_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":173,"author":{"gitId":"hjuntan"},"content":" + GROUP_DESC_HUSBAND + GROUP_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":175,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":176,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + TAG_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":177,"author":{"gitId":"hjuntan"},"content":" + GROUP_DESC_HUSBAND + GROUP_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":179,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":180,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_TAG_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":181,"author":{"gitId":"hjuntan"},"content":" + GROUP_DESC_HUSBAND + GROUP_DESC_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":183,"author":{"gitId":"hjuntan"},"content":" // invalid group","lastModifiedDate":"2024-03-11"},{"lineNumber":184,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_BOB","lastModifiedDate":"2024-03-11"},{"lineNumber":185,"author":{"gitId":"hjuntan"},"content":" + INVALID_GROUP_DESC + VALID_GROUP_FRIEND, Group.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":187,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":188,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_TAG_DESC,","lastModifiedDate":"2024-03-11"},{"lineNumber":189,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":193,"author":{"gitId":"hjuntan"},"content":" + TAG_DESC_BOB + GROUP_DESC_HUSBAND + GROUP_DESC_FRIEND,","lastModifiedDate":"2024-03-11"},{"lineNumber":194,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":196,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"hjuntan":52,"-":144}},{"path":"src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2016-10-16"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class ArgumentTokenizerTest {","lastModifiedDate":"2016-10-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" private final Prefix unknownPrefix \u003d new Prefix(\"--u\");","lastModifiedDate":"2016-10-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final Prefix pSlash \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-03-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final Prefix dashT \u003d new Prefix(\"-t\");","lastModifiedDate":"2016-10-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private final Prefix hatQ \u003d new Prefix(\"^Q\");","lastModifiedDate":"2016-10-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void tokenize_emptyArgsString_noValues() {","lastModifiedDate":"2016-10-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String argsString \u003d \" \";","lastModifiedDate":"2016-10-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":23,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private void assertPreamblePresent(ArgumentMultimap argMultimap, String expectedPreamble) {","lastModifiedDate":"2017-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(expectedPreamble, argMultimap.getPreamble());","lastModifiedDate":"2017-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private void assertPreambleEmpty(ArgumentMultimap argMultimap) {","lastModifiedDate":"2017-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertTrue(argMultimap.getPreamble().isEmpty());","lastModifiedDate":"2017-03-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Asserts all the arguments in {@code argMultimap} with {@code prefix} match the {@code expectedValues}","lastModifiedDate":"2017-08-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * and only the last value is returned upon calling {@code ArgumentMultimap#getValue(Prefix)}.","lastModifiedDate":"2017-08-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private void assertArgumentPresent(ArgumentMultimap argMultimap, Prefix prefix, String... expectedValues) {","lastModifiedDate":"2017-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // Verify the last value is returned","lastModifiedDate":"2016-10-16"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[expectedValues.length - 1], argMultimap.getValue(prefix).get());","lastModifiedDate":"2017-06-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // Verify the number of values returned is as expected","lastModifiedDate":"2016-10-16"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertEquals(expectedValues.length, argMultimap.getAllValues(prefix).size());","lastModifiedDate":"2017-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Verify all values returned are as expected and in order","lastModifiedDate":"2016-10-16"},{"lineNumber":47,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c expectedValues.length; i++) {","lastModifiedDate":"2016-10-16"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(expectedValues[i], argMultimap.getAllValues(prefix).get(i));","lastModifiedDate":"2017-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private void assertArgumentAbsent(ArgumentMultimap argMultimap, Prefix prefix) {","lastModifiedDate":"2017-03-08"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(argMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void tokenize_noPrefixes_allTakenAsPreamble() {","lastModifiedDate":"2016-10-16"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" String argsString \u003d \" some random string /t group with leading and trailing spaces \";","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString);","lastModifiedDate":"2017-03-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":61,"author":{"gitId":"-"},"content":" // Same string expected as preamble, but leading/trailing spaces should be trimmed","lastModifiedDate":"2016-10-16"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString.trim());","lastModifiedDate":"2017-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void tokenize_oneArgument() {","lastModifiedDate":"2016-10-16"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Preamble present","lastModifiedDate":"2016-10-16"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String argsString \u003d \" Some preamble string p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Some preamble string\");","lastModifiedDate":"2017-03-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // No preamble","lastModifiedDate":"2016-10-16"},{"lineNumber":75,"author":{"gitId":"-"},"content":" argsString \u003d \" p/ Argument value \";","lastModifiedDate":"2017-03-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash);","lastModifiedDate":"2017-03-20"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"Argument value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void tokenize_multipleArguments() {","lastModifiedDate":"2016-10-16"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // Only two arguments are present","lastModifiedDate":"2016-10-16"},{"lineNumber":85,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-03-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // All three arguments are present","lastModifiedDate":"2017-05-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" argsString \u003d \"Different Preamble String ^Q111 -t dashT-Value p/pSlash value\";","lastModifiedDate":"2017-03-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"Different Preamble String\");","lastModifiedDate":"2017-03-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"111\");","lastModifiedDate":"2017-03-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":100,"author":{"gitId":"-"},"content":" /* Also covers: Reusing of the tokenizer multiple times */","lastModifiedDate":"2016-10-16"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // Reuse tokenizer on an empty string to ensure ArgumentMultimap is correctly reset","lastModifiedDate":"2017-03-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // (i.e. no stale values from the previous tokenizing remain)","lastModifiedDate":"2017-03-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":" argsString \u003d \"\";","lastModifiedDate":"2017-03-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertPreambleEmpty(argMultimap);","lastModifiedDate":"2017-03-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-03-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /* Also covers: testing for prefixes not specified as a prefix */","lastModifiedDate":"2020-05-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Prefixes not previously given to the tokenizer should not return any values","lastModifiedDate":"2016-10-16"},{"lineNumber":112,"author":{"gitId":"-"},"content":" argsString \u003d unknownPrefix + \"some value\";","lastModifiedDate":"2017-05-09"},{"lineNumber":113,"author":{"gitId":"-"},"content":" argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, unknownPrefix);","lastModifiedDate":"2017-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, argsString); // Unknown prefix is taken as part of preamble","lastModifiedDate":"2017-03-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsWithRepeats() {","lastModifiedDate":"2016-10-16"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // Two arguments repeated, some have empty values","lastModifiedDate":"2016-10-16"},{"lineNumber":121,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleString -t dashT-Value ^Q ^Q -t another dashT value p/ pSlash value -t\";","lastModifiedDate":"2017-03-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-03-20"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleString\");","lastModifiedDate":"2017-03-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, pSlash, \"pSlash value\");","lastModifiedDate":"2017-03-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"dashT-Value\", \"another dashT value\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, hatQ, \"\", \"\");","lastModifiedDate":"2017-03-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-19"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void tokenize_multipleArgumentsJoined() {","lastModifiedDate":"2017-05-19"},{"lineNumber":131,"author":{"gitId":"-"},"content":" String argsString \u003d \"SomePreambleStringp/ pSlash joined-tjoined -t not joined^Qjoined\";","lastModifiedDate":"2017-05-19"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertPreamblePresent(argMultimap, \"SomePreambleStringp/ pSlash joined-tjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, pSlash);","lastModifiedDate":"2017-05-19"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertArgumentPresent(argMultimap, dashT, \"not joined^Qjoined\");","lastModifiedDate":"2017-05-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertArgumentAbsent(argMultimap, hatQ);","lastModifiedDate":"2017-05-19"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-19"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-19"},{"lineNumber":139,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-10-16"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public void equalsMethod() {","lastModifiedDate":"2016-10-16"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Prefix aaa \u003d new Prefix(\"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":143,"author":{"gitId":"-"},"content":" assertEquals(aaa, aaa);","lastModifiedDate":"2016-10-16"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertEquals(aaa, new Prefix(\"aaa\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, \"aaa\");","lastModifiedDate":"2016-10-16"},{"lineNumber":147,"author":{"gitId":"-"},"content":" assertNotEquals(aaa, new Prefix(\"aab\"));","lastModifiedDate":"2016-10-16"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-16"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-16"},{"lineNumber":150,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-16"}],"authorContributionMap":{"hjuntan":1,"-":149}},{"path":"src/test/java/seedu/address/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.GROUP_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.GROUP_DESC_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_GROUP_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-04"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"hjuntan"},"content":" private static final String GROUP_EMPTY \u003d \" \" + PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"-5\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"0\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2018-09-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2018-09-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2018-09-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, \"1\" + INVALID_GROUP_DESC, Group.MESSAGE_CONSTRAINTS); // invalid group","lastModifiedDate":"2024-03-11"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC + EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":95,"author":{"gitId":"hjuntan"},"content":" // while parsing {@code PREFIX_GROUP} alone will reset the groups of the {@code Person} being edited,","lastModifiedDate":"2024-03-11"},{"lineNumber":96,"author":{"gitId":"hjuntan"},"content":" // parsing it together with a valid group results in error","lastModifiedDate":"2024-03-11"},{"lineNumber":97,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, \"1\" + GROUP_DESC_FRIEND + GROUP_DESC_HUSBAND","lastModifiedDate":"2024-03-11"},{"lineNumber":98,"author":{"gitId":"hjuntan"},"content":" + GROUP_EMPTY, Group.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":99,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, \"1\" + GROUP_DESC_FRIEND + GROUP_EMPTY","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"hjuntan"},"content":" + GROUP_DESC_HUSBAND, Group.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, \"1\" + GROUP_EMPTY + GROUP_DESC_FRIEND","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"hjuntan"},"content":" + GROUP_DESC_HUSBAND, Group.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":104,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":105,"author":{"gitId":"hjuntan"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC + INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":106,"author":{"gitId":"hjuntan"},"content":" + VALID_TAG_AMY + VALID_PHONE_AMY,","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":110,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":112,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":113,"author":{"gitId":"hjuntan"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + GROUP_DESC_HUSBAND","lastModifiedDate":"2024-03-11"},{"lineNumber":114,"author":{"gitId":"hjuntan"},"content":" + EMAIL_DESC_AMY + TAG_DESC_AMY + NAME_DESC_AMY + GROUP_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"hjuntan"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withTag(VALID_TAG_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"hjuntan"},"content":" .withGroups(VALID_GROUP_HUSBAND, VALID_GROUP_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":124,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":127,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":138,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":139,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":140,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + NAME_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":141,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":143,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":145,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":146,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":147,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":149,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":152,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":153,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":155,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":157,"author":{"gitId":"hjuntan"},"content":" // tag","lastModifiedDate":"2024-03-11"},{"lineNumber":158,"author":{"gitId":"hjuntan"},"content":" userInput \u003d targetIndex.getOneBased() + TAG_DESC_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":159,"author":{"gitId":"hjuntan"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTag(VALID_TAG_AMY).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":163,"author":{"gitId":"hjuntan"},"content":" // groups","lastModifiedDate":"2024-03-11"},{"lineNumber":164,"author":{"gitId":"hjuntan"},"content":" userInput \u003d targetIndex.getOneBased() + GROUP_DESC_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":165,"author":{"gitId":"hjuntan"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withGroups(VALID_GROUP_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":166,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":170,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":171,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":172,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":173,"author":{"gitId":"hjuntan"},"content":" // AddCommandParserTest#parse_repeatedNonGroupValue_failure()","lastModifiedDate":"2024-03-11"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":175,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":177,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + PHONE_DESC_BOB;","lastModifiedDate":"2023-07-14"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":181,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":182,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + INVALID_PHONE_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":186,"author":{"gitId":"hjuntan"},"content":" // multiple valid fields repeated","lastModifiedDate":"2024-03-11"},{"lineNumber":187,"author":{"gitId":"hjuntan"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY + TAG_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2024-03-11"},{"lineNumber":188,"author":{"gitId":"hjuntan"},"content":" + GROUP_DESC_FRIEND + PHONE_DESC_AMY + TAG_DESC_AMY + EMAIL_DESC_AMY + GROUP_DESC_FRIEND","lastModifiedDate":"2024-03-11"},{"lineNumber":189,"author":{"gitId":"hjuntan"},"content":" + PHONE_DESC_BOB + TAG_DESC_BOB + EMAIL_DESC_BOB + GROUP_DESC_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":191,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":192,"author":{"gitId":"hjuntan"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG));","lastModifiedDate":"2024-03-11"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":194,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"hjuntan"},"content":" userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_TAG_DESC + INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-11"},{"lineNumber":196,"author":{"gitId":"hjuntan"},"content":" + INVALID_PHONE_DESC + INVALID_TAG_DESC + INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-11"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":199,"author":{"gitId":"hjuntan"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG));","lastModifiedDate":"2024-03-11"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"hjuntan"},"content":" public void parse_resetGroups_success() {","lastModifiedDate":"2024-03-11"},{"lineNumber":204,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":205,"author":{"gitId":"hjuntan"},"content":" String userInput \u003d targetIndex.getOneBased() + GROUP_EMPTY;","lastModifiedDate":"2024-03-11"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":207,"author":{"gitId":"hjuntan"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withGroups().build();","lastModifiedDate":"2024-03-11"},{"lineNumber":208,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":210,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":211,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":212,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"hjuntan":45,"-":167}},{"path":"src/test/java/seedu/address/logic/parser/ParserUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.ParserUtil.MESSAGE_INVALID_INDEX;","lastModifiedDate":"2017-06-02"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-05-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-05-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-05-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-22"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-22"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtilTest {","lastModifiedDate":"2017-05-22"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2017-05-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2017-05-22"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":" private static final String INVALID_TAG \u003d \" \";","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" private static final String INVALID_GROUP \u003d \"#friend\";","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d \"Rachel Walker\";","lastModifiedDate":"2017-05-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d \"123456\";","lastModifiedDate":"2017-05-22"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" private static final String VALID_TAG \u003d \"Student\";","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d \"rachel@example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" private static final String VALID_GROUP_1 \u003d \"friend\";","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" private static final String VALID_GROUP_2 \u003d \"neighbour\";","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String WHITESPACE \u003d \" \\t\\r\\n\";","lastModifiedDate":"2017-05-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void parseIndex_invalidInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseIndex(\"10 a\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void parseIndex_outOfRangeInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_INVALID_INDEX, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" -\u003e ParserUtil.parseIndex(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2019-03-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void parseIndex_validInput_success() throws Exception {","lastModifiedDate":"2017-05-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // No whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\"1\"));","lastModifiedDate":"2017-05-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // Leading and trailing whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\" 1 \"));","lastModifiedDate":"2017-05-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void parseName_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseName((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parseName_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseName(INVALID_NAME));","lastModifiedDate":"2019-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parseName_validValueWithoutWhitespace_returnsName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(VALID_NAME));","lastModifiedDate":"2017-05-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String nameWithWhitespace \u003d WHITESPACE + VALID_NAME + WHITESPACE;","lastModifiedDate":"2017-05-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace));","lastModifiedDate":"2017-05-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void parsePhone_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePhone((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void parsePhone_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePhone(INVALID_PHONE));","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-22"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE));","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" String phoneWithWhitespace \u003d WHITESPACE + VALID_PHONE + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":106,"author":{"gitId":"hjuntan"},"content":" public void parseTag_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"hjuntan"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTag((String) null));","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":110,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":111,"author":{"gitId":"hjuntan"},"content":" public void parseTag_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"hjuntan"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTag(INVALID_TAG));","lastModifiedDate":"2024-03-11"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":115,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":116,"author":{"gitId":"hjuntan"},"content":" public void parseTag_validValueWithoutWhitespace_returnsTag() throws Exception {","lastModifiedDate":"2024-03-11"},{"lineNumber":117,"author":{"gitId":"hjuntan"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG);","lastModifiedDate":"2024-03-11"},{"lineNumber":118,"author":{"gitId":"hjuntan"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(VALID_TAG));","lastModifiedDate":"2024-03-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":121,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"hjuntan"},"content":" public void parseTag_validValueWithWhitespace_returnsTrimmedTag() throws Exception {","lastModifiedDate":"2024-03-11"},{"lineNumber":123,"author":{"gitId":"hjuntan"},"content":" String tagWithWhitespace \u003d WHITESPACE + VALID_TAG + WHITESPACE;","lastModifiedDate":"2024-03-11"},{"lineNumber":124,"author":{"gitId":"hjuntan"},"content":" Tag expectedTag \u003d new Tag(VALID_TAG);","lastModifiedDate":"2024-03-11"},{"lineNumber":125,"author":{"gitId":"hjuntan"},"content":" assertEquals(expectedTag, ParserUtil.parseTag(tagWithWhitespace));","lastModifiedDate":"2024-03-11"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public void parseEmail_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmail((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public void parseEmail_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":135,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmail(INVALID_EMAIL));","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-22"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL));","lastModifiedDate":"2017-05-30"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" String emailWithWhitespace \u003d WHITESPACE + VALID_EMAIL + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-30"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":152,"author":{"gitId":"hjuntan"},"content":" public void parseGroup_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":153,"author":{"gitId":"hjuntan"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseGroup(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":156,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":157,"author":{"gitId":"hjuntan"},"content":" public void parseGroup_invalidValue_throwsParseException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":158,"author":{"gitId":"hjuntan"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseGroup(INVALID_GROUP));","lastModifiedDate":"2024-03-11"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":161,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":162,"author":{"gitId":"hjuntan"},"content":" public void parseGroup_validValueWithoutWhitespace_returnsGroup() throws Exception {","lastModifiedDate":"2024-03-11"},{"lineNumber":163,"author":{"gitId":"hjuntan"},"content":" Group expectedGroup \u003d new Group(VALID_GROUP_1);","lastModifiedDate":"2024-03-11"},{"lineNumber":164,"author":{"gitId":"hjuntan"},"content":" assertEquals(expectedGroup, ParserUtil.parseGroup(VALID_GROUP_1));","lastModifiedDate":"2024-03-11"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":167,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":168,"author":{"gitId":"hjuntan"},"content":" public void parseGroup_validValueWithWhitespace_returnsTrimmedGroup() throws Exception {","lastModifiedDate":"2024-03-11"},{"lineNumber":169,"author":{"gitId":"hjuntan"},"content":" String groupWithWhitespace \u003d WHITESPACE + VALID_GROUP_1 + WHITESPACE;","lastModifiedDate":"2024-03-11"},{"lineNumber":170,"author":{"gitId":"hjuntan"},"content":" Group expectedGroup \u003d new Group(VALID_GROUP_1);","lastModifiedDate":"2024-03-11"},{"lineNumber":171,"author":{"gitId":"hjuntan"},"content":" assertEquals(expectedGroup, ParserUtil.parseGroup(groupWithWhitespace));","lastModifiedDate":"2024-03-11"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":175,"author":{"gitId":"hjuntan"},"content":" public void parseGroups_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":176,"author":{"gitId":"hjuntan"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseGroups(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":179,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":180,"author":{"gitId":"hjuntan"},"content":" public void parseGroups_collectionWithInvalidGroups_throwsParseException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":181,"author":{"gitId":"hjuntan"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseGroups(Arrays.asList(VALID_GROUP_1,","lastModifiedDate":"2024-03-11"},{"lineNumber":182,"author":{"gitId":"hjuntan"},"content":" INVALID_GROUP)));","lastModifiedDate":"2024-03-11"},{"lineNumber":183,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":185,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":186,"author":{"gitId":"hjuntan"},"content":" public void parseGroups_emptyCollection_returnsEmptySet() throws Exception {","lastModifiedDate":"2024-03-11"},{"lineNumber":187,"author":{"gitId":"hjuntan"},"content":" assertTrue(ParserUtil.parseGroups(Collections.emptyList()).isEmpty());","lastModifiedDate":"2024-03-11"},{"lineNumber":188,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":190,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":191,"author":{"gitId":"hjuntan"},"content":" public void parseGroups_collectionWithValidGroups_returnsGroupSet() throws Exception {","lastModifiedDate":"2024-03-11"},{"lineNumber":192,"author":{"gitId":"hjuntan"},"content":" Set\u003cGroup\u003e actualGroupSet \u003d ParserUtil.parseGroups(Arrays.asList(VALID_GROUP_1,","lastModifiedDate":"2024-03-11"},{"lineNumber":193,"author":{"gitId":"hjuntan"},"content":" VALID_GROUP_2));","lastModifiedDate":"2024-03-11"},{"lineNumber":194,"author":{"gitId":"hjuntan"},"content":" Set\u003cGroup\u003e expectedGroupSet \u003d new HashSet\u003cGroup\u003e(Arrays.asList(new Group(VALID_GROUP_1),","lastModifiedDate":"2024-03-11"},{"lineNumber":195,"author":{"gitId":"hjuntan"},"content":" new Group(VALID_GROUP_2)));","lastModifiedDate":"2024-03-11"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":197,"author":{"gitId":"hjuntan"},"content":" assertEquals(expectedGroupSet, actualGroupSet);","lastModifiedDate":"2024-03-11"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":199,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-22"}],"authorContributionMap":{"hjuntan":42,"-":157}},{"path":"src/test/java/seedu/address/model/AddressBookTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model;","lastModifiedDate":"2016-12-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2017-07-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2016-12-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2016-12-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2016-12-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-12-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-12-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2018-08-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-04-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookTest {","lastModifiedDate":"2016-12-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final AddressBook addressBook \u003d new AddressBook();","lastModifiedDate":"2016-12-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2016-12-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), addressBook.getPersonList());","lastModifiedDate":"2016-12-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e addressBook.resetData(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void resetData_withValidReadOnlyAddressBook_replacesData() {","lastModifiedDate":"2016-12-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" AddressBook newData \u003d getTypicalAddressBook();","lastModifiedDate":"2017-07-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" addressBook.resetData(newData);","lastModifiedDate":"2016-12-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(newData, addressBook);","lastModifiedDate":"2016-12-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-12-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void resetData_withDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Two persons with the same identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withTag(VALID_TAG_BOB).withGroups(VALID_GROUP_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-04-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e newPersons \u003d Arrays.asList(ALICE, editedAlice);","lastModifiedDate":"2018-04-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBookStub newData \u003d new AddressBookStub(newPersons);","lastModifiedDate":"2018-03-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e addressBook.resetData(newData));","lastModifiedDate":"2019-03-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e addressBook.hasPerson(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(addressBook.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":" addressBook.addPerson(ALICE);","lastModifiedDate":"2018-08-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertTrue(addressBook.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" addressBook.addPerson(ALICE);","lastModifiedDate":"2018-08-06"},{"lineNumber":76,"author":{"gitId":"hjuntan"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withTag(VALID_TAG_BOB).withGroups(VALID_GROUP_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertTrue(addressBook.hasPerson(editedAlice));","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void getPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e addressBook.getPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expected \u003d AddressBook.class.getCanonicalName() + \"{persons\u003d\" + addressBook.getPersonList() + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertEquals(expected, addressBook.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * A stub ReadOnlyAddressBook whose persons list can violate interface constraints.","lastModifiedDate":"2018-03-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static class AddressBookStub implements ReadOnlyAddressBook {","lastModifiedDate":"2016-12-24"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e persons \u003d FXCollections.observableArrayList();","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" AddressBookStub(Collection\u003cPerson\u003e persons) {","lastModifiedDate":"2018-03-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":" this.persons.setAll(persons);","lastModifiedDate":"2016-12-24"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return persons;","lastModifiedDate":"2016-12-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-24"}],"authorContributionMap":{"hjuntan":4,"-":104}},{"path":"src/test/java/seedu/address/model/group/GroupTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"package seedu.address.model.group;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"public class GroupTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"hjuntan"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"hjuntan"},"content":" assertThrows(NullPointerException.class, () -\u003e new Group(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"hjuntan"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"hjuntan"},"content":" public void constructor_invalidGroupName_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":" String invalidGroupName \u003d \"\";","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Group(invalidGroupName));","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":" public void isValidGroupName() {","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"hjuntan"},"content":" // null group name","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"hjuntan"},"content":" assertThrows(NullPointerException.class, () -\u003e Group.isValidGroupName(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"hjuntan":26}},{"path":"src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2017-06-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicateTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" List\u003cString\u003e firstPredicateKeywordList \u003d Collections.singletonList(\"first\");","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" List\u003cString\u003e secondPredicateKeywordList \u003d Arrays.asList(\"first\", \"second\");","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d new NameContainsKeywordsPredicate(secondPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicateCopy \u003d new NameContainsKeywordsPredicate(firstPredicateKeywordList);","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(firstPredicate.equals(firstPredicateCopy));","lastModifiedDate":"2017-06-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(1));","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(null));","lastModifiedDate":"2017-06-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertFalse(firstPredicate.equals(secondPredicate));","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void test_nameContainsKeywords_returnsTrue() {","lastModifiedDate":"2017-08-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // One keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Collections.singletonList(\"Alice\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Multiple keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // Only one matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Bob\", \"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Carol\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // Mixed-case keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"aLIce\", \"bOB\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void test_nameDoesNotContainKeywords_returnsFalse() {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // Zero keywords","lastModifiedDate":"2017-06-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Collections.emptyList());","lastModifiedDate":"2017-06-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // Non-matching keyword","lastModifiedDate":"2017-06-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"Carol\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice Bob\").build()));","lastModifiedDate":"2017-06-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":71,"author":{"gitId":"hjuntan"},"content":" // Keywords match phone, email and tag, but does not match name","lastModifiedDate":"2024-03-11"},{"lineNumber":72,"author":{"gitId":"hjuntan"},"content":" predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"12345\", \"alice@email.com\", \"Student\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertFalse(predicate.test(new PersonBuilder().withName(\"Alice\").withPhone(\"12345\")","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"hjuntan"},"content":" .withEmail(\"alice@email.com\").withTag(\"Student\").build()));","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d List.of(\"keyword1\", \"keyword2\");","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(keywords);","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" String expected \u003d NameContainsKeywordsPredicate.class.getCanonicalName() + \"{keywords\u003d\" + keywords + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertEquals(expected, predicate.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"hjuntan":3,"-":82}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":10,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getGroups().remove(0));","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2020-12-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2020-12-18"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" .withTag(VALID_TAG_BOB).withGroups(VALID_GROUP_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedBob \u003d new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2020-12-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editedBob \u003d new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"hjuntan"},"content":" // different tag -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"hjuntan"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTag(VALID_TAG_BOB).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":88,"author":{"gitId":"hjuntan"},"content":" // different groups -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"hjuntan"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withGroups(VALID_GROUP_HUSBAND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"hjuntan"},"content":" String expected \u003d Person.class.getCanonicalName()","lastModifiedDate":"2024-03-12"},{"lineNumber":96,"author":{"gitId":"hjuntan"},"content":" + \"{nusId\u003d\" + ALICE.getNusId() + \", name\u003d\" + ALICE.getName()","lastModifiedDate":"2024-03-12"},{"lineNumber":97,"author":{"gitId":"hjuntan"},"content":" + \", phone\u003d\" + ALICE.getPhone() + \", email\u003d\" + ALICE.getEmail()","lastModifiedDate":"2024-03-12"},{"lineNumber":98,"author":{"gitId":"hjuntan"},"content":" + \", tag\u003d\" + ALICE.getTag() + \", groups\u003d\" + ALICE.getGroups() + \"}\";","lastModifiedDate":"2024-03-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"hjuntan":12,"-":89}},{"path":"src/test/java/seedu/address/model/person/TagTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"hjuntan"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"hjuntan"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"public class TagTest {","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"hjuntan"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":" assertThrows(NullPointerException.class, () -\u003e new Tag(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"hjuntan"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"hjuntan"},"content":" public void constructor_invalidTag_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"hjuntan"},"content":" String invalidTag \u003d \"\";","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"hjuntan"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(invalidTag));","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"hjuntan"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"hjuntan"},"content":" public void isValidTag() {","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" // null tag","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"hjuntan"},"content":" assertThrows(NullPointerException.class, () -\u003e Tag.isValidTag(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":" // invalid tags","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" assertFalse(Tag.isValidTag(\"\")); // empty string","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" assertFalse(Tag.isValidTag(\" \")); // spaces only","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" // valid tags","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" assertTrue(Tag.isValidTag(\"Student\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" assertTrue(Tag.isValidTag(\"Professor\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" assertTrue(Tag.isValidTag(\"TA\"));","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" @Test","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" public void equals() {","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" Tag tag \u003d new Tag(\"Student\");","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" assertTrue(tag.equals(new Tag(\"Student\")));","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" assertTrue(tag.equals(tag));","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"hjuntan"},"content":" assertFalse(tag.equals(null));","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"hjuntan"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":" assertFalse(tag.equals(5.0f));","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"hjuntan"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"hjuntan"},"content":" assertFalse(tag.equals(new Tag(\"Professor\")));","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"hjuntan"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"hjuntan"},"content":"}","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"hjuntan":56}},{"path":"src/test/java/seedu/address/model/person/UniquePersonListTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-08-09"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-08-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-08-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2018-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2018-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"public class UniquePersonListTest {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final UniquePersonList uniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void contains_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.contains(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public void contains_personNotInList_returnsFalse() {","lastModifiedDate":"2018-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(uniquePersonList.contains(ALICE));","lastModifiedDate":"2018-08-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void contains_personInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(uniquePersonList.contains(ALICE));","lastModifiedDate":"2018-08-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void contains_personWithSameIdentityFieldsInList_returnsTrue() {","lastModifiedDate":"2018-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withTag(VALID_TAG_BOB).withGroups(VALID_GROUP_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertTrue(uniquePersonList.contains(editedAlice));","lastModifiedDate":"2018-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void add_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":52,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.add(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void add_duplicatePerson_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.add(ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void setPerson_nullTargetPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPerson(null, ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void setPerson_nullEditedPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPerson(ALICE, null));","lastModifiedDate":"2019-03-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void setPerson_targetPersonNotInList_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList.setPerson(ALICE, ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonIsSamePerson_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":78,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" uniquePersonList.setPerson(ALICE, ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":80,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":81,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasSameIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":88,"author":{"gitId":"hjuntan"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withTag(VALID_TAG_BOB).withGroups(VALID_GROUP_HUSBAND)","lastModifiedDate":"2024-03-11"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" uniquePersonList.setPerson(ALICE, editedAlice);","lastModifiedDate":"2018-08-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":92,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(editedAlice);","lastModifiedDate":"2018-08-08"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasDifferentIdentity_success() {","lastModifiedDate":"2018-08-08"},{"lineNumber":98,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":" uniquePersonList.setPerson(ALICE, BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":100,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void setPerson_editedPersonHasNonUniqueIdentity_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" uniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.setPerson(ALICE, BOB));","lastModifiedDate":"2019-03-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public void remove_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.remove(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void remove_personDoesNotExist_throwsPersonNotFoundException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertThrows(PersonNotFoundException.class, () -\u003e uniquePersonList.remove(ALICE));","lastModifiedDate":"2019-03-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public void remove_existingPerson_removesPerson() {","lastModifiedDate":"2018-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" uniquePersonList.remove(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" public void setPersons_nullUniquePersonList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((UniquePersonList) null));","lastModifiedDate":"2019-03-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void setPersons_uniquePersonList_replacesOwnListWithProvidedUniquePersonList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(expectedUniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void setPersons_nullList_throwsNullPointerException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e uniquePersonList.setPersons((List\u003cPerson\u003e) null));","lastModifiedDate":"2019-03-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void setPersons_list_replacesOwnListWithProvidedList() {","lastModifiedDate":"2018-08-08"},{"lineNumber":151,"author":{"gitId":"-"},"content":" uniquePersonList.add(ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e personList \u003d Collections.singletonList(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":153,"author":{"gitId":"-"},"content":" uniquePersonList.setPersons(personList);","lastModifiedDate":"2018-08-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":" UniquePersonList expectedUniquePersonList \u003d new UniquePersonList();","lastModifiedDate":"2018-08-08"},{"lineNumber":155,"author":{"gitId":"-"},"content":" expectedUniquePersonList.add(BOB);","lastModifiedDate":"2018-08-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertEquals(expectedUniquePersonList, uniquePersonList);","lastModifiedDate":"2018-08-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":159,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-08"},{"lineNumber":160,"author":{"gitId":"-"},"content":" public void setPersons_listWithDuplicatePersons_throwsDuplicatePersonException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e listWithDuplicatePersons \u003d Arrays.asList(ALICE, ALICE);","lastModifiedDate":"2018-08-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" assertThrows(DuplicatePersonException.class, () -\u003e uniquePersonList.setPersons(listWithDuplicatePersons));","lastModifiedDate":"2019-03-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void asUnmodifiableObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2018-04-05"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":" -\u003e uniquePersonList.asUnmodifiableObservableList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":171,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-24"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-24"},{"lineNumber":173,"author":{"gitId":"-"},"content":" assertEquals(uniquePersonList.asUnmodifiableObservableList().toString(), uniquePersonList.toString());","lastModifiedDate":"2019-02-24"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"hjuntan":4,"-":171}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"hjuntan"},"content":" private static final String INVALID_TAG \u003d \" \";","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"hjuntan"},"content":" private static final String INVALID_GROUP \u003d \"#friend\";","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"hjuntan"},"content":" private static final String VALID_NUSID \u003d BENSON.getNusId().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" private static final String VALID_TAG \u003d BENSON.getTag().toString();","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" private static final List\u003cJsonAdaptedGroup\u003e VALID_GROUPS \u003d BENSON.getGroups().stream()","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"hjuntan"},"content":" .map(JsonAdaptedGroup::new)","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_TAG, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"hjuntan"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, null, VALID_PHONE, VALID_EMAIL, VALID_TAG, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_TAG, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"hjuntan"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":69,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, VALID_NAME, null, VALID_EMAIL, VALID_TAG, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_TAG, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"hjuntan"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, VALID_NAME, VALID_PHONE, null, VALID_TAG, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"hjuntan"},"content":" public void toModelType_invalidTag_throwsIllegalValueException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":92,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_TAG, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":94,"author":{"gitId":"hjuntan"},"content":" String expectedMessage \u003d Tag.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-03-11"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"hjuntan"},"content":" public void toModelType_nullTag_throwsIllegalValueException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":100,"author":{"gitId":"hjuntan"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-03-11"},{"lineNumber":101,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":102,"author":{"gitId":"hjuntan"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Tag.class.getSimpleName());","lastModifiedDate":"2024-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":107,"author":{"gitId":"hjuntan"},"content":" public void toModelType_invalidGroups_throwsIllegalValueException() {","lastModifiedDate":"2024-03-11"},{"lineNumber":108,"author":{"gitId":"hjuntan"},"content":" List\u003cJsonAdaptedGroup\u003e invalidGroups \u003d new ArrayList\u003c\u003e(VALID_GROUPS);","lastModifiedDate":"2024-03-11"},{"lineNumber":109,"author":{"gitId":"hjuntan"},"content":" invalidGroups.add(new JsonAdaptedGroup(INVALID_GROUP));","lastModifiedDate":"2024-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"hjuntan"},"content":" new JsonAdaptedPerson(VALID_NUSID, VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_TAG, invalidGroups);","lastModifiedDate":"2024-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"hjuntan":27,"-":88}},{"path":"src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":8,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-12-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-12-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-12-23"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" descriptor.setTag(person.getTag());","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" descriptor.setGroups(person.getGroups());","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"hjuntan"},"content":" * Sets the {@code Tag} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-03-11"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"hjuntan"},"content":" public EditPersonDescriptorBuilder withTag(String tag) {","lastModifiedDate":"2024-03-11"},{"lineNumber":70,"author":{"gitId":"hjuntan"},"content":" descriptor.setTag(new Tag(tag));","lastModifiedDate":"2024-03-11"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"hjuntan"},"content":" * Parses the {@code groups} into a {@code Set\u003cGroup\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2024-03-11"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"hjuntan"},"content":" public EditPersonDescriptorBuilder withGroups(String... groups) {","lastModifiedDate":"2024-03-11"},{"lineNumber":79,"author":{"gitId":"hjuntan"},"content":" Set\u003cGroup\u003e groupSet \u003d Stream.of(groups).map(Group::new).collect(Collectors.toSet());","lastModifiedDate":"2024-03-11"},{"lineNumber":80,"author":{"gitId":"hjuntan"},"content":" descriptor.setGroups(groupSet);","lastModifiedDate":"2024-03-11"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"hjuntan":11,"-":76}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-01-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-01-18"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.NusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-04-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-01-18"},{"lineNumber":12,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.person.Tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":20,"author":{"gitId":"hjuntan"},"content":" public static final String DEFAULT_NUSID \u003d \"E1234567\";","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":24,"author":{"gitId":"hjuntan"},"content":" public static final String DEFAULT_TAG \u003d \"Student\";","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"hjuntan"},"content":" private NusId nusId;","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":30,"author":{"gitId":"hjuntan"},"content":" private Tag tag;","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" private Set\u003cGroup\u003e groups;","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" nusId \u003d new NusId(DEFAULT_NUSID);","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" tag \u003d new Tag(DEFAULT_TAG);","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" groups \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"hjuntan"},"content":" nusId \u003d personToCopy.getNusId();","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" tag \u003d personToCopy.getTag();","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"hjuntan"},"content":" groups \u003d new HashSet\u003c\u003e(personToCopy.getGroups());","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" /**","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" * Sets the {@code NusId} of the {@code Person} that we are building.","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" */","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"hjuntan"},"content":" public PersonBuilder withNusId(String nusId) {","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":" this.nusId \u003d new NusId(nusId);","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"hjuntan"},"content":" return this;","lastModifiedDate":"2024-03-11"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":74,"author":{"gitId":"hjuntan"},"content":" * Parses the {@code groups} into a {@code Set\u003cGroup\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2024-03-11"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"hjuntan"},"content":" public PersonBuilder withGroups(String ... groups) {","lastModifiedDate":"2024-03-11"},{"lineNumber":77,"author":{"gitId":"hjuntan"},"content":" this.groups \u003d SampleDataUtil.getGroupSet(groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":82,"author":{"gitId":"hjuntan"},"content":" * Sets the {@code Tag} of the {@code Person} that we are building.","lastModifiedDate":"2024-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"hjuntan"},"content":" public PersonBuilder withTag(String tag) {","lastModifiedDate":"2024-03-11"},{"lineNumber":85,"author":{"gitId":"hjuntan"},"content":" this.tag \u003d new Tag(tag);","lastModifiedDate":"2024-03-11"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":101,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":102,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":106,"author":{"gitId":"hjuntan"},"content":" return new Person(nusId, name, phone, email, tag, groups);","lastModifiedDate":"2024-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"hjuntan":27,"-":82}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":4,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2018-03-26"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":"import seedu.address.model.group.Group;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":25,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":32,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":" sb.append(PREFIX_TAG + person.getTag().value.toString() + \" \");","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" person.getGroups().stream().forEach(","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" s -\u003e sb.append(PREFIX_GROUP + s.groupName + \" \")","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":" descriptor.getTag().ifPresent(tag -\u003e sb.append(PREFIX_TAG).append(tag.value).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"hjuntan"},"content":" if (descriptor.getGroups().isPresent()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" Set\u003cGroup\u003e groups \u003d descriptor.getGroups().get();","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"hjuntan"},"content":" if (groups.isEmpty()) {","lastModifiedDate":"2024-03-11"},{"lineNumber":55,"author":{"gitId":"hjuntan"},"content":" sb.append(PREFIX_GROUP);","lastModifiedDate":"2024-03-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" groups.forEach(s -\u003e sb.append(PREFIX_GROUP).append(s.groupName).append(\" \"));","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"hjuntan":11,"-":51}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_FRIEND;","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_GROUP_HUSBAND;","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":9,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSID_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSID_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_AMY;","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"hjuntan"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BOB;","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":28,"author":{"gitId":"hjuntan"},"content":" public static final Person ALICE \u003d new PersonBuilder().withNusId(\"E9846510\").withName(\"Alice Pauline\")","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"hjuntan"},"content":" .withTag(\"Student\").withEmail(\"alice@example.com\")","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"hjuntan"},"content":" .withGroups(\"friends\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"hjuntan"},"content":" public static final Person BENSON \u003d new PersonBuilder().withNusId(\"E9682156\").withName(\"Benson Meier\")","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"hjuntan"},"content":" .withTag(\"Student\").withGroups(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"hjuntan"},"content":" public static final Person CARL \u003d new PersonBuilder().withNusId(\"E0358435\").withName(\"Carl Kurz\")","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"hjuntan"},"content":" .withPhone(\"95352563\").withEmail(\"heinz@example.com\")","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"hjuntan"},"content":" .withTag(\"TA\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withNusId(\"E1237864\").withName(\"Daniel Meier\")","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"hjuntan"},"content":" .withPhone(\"87652533\").withEmail(\"cornelia@example.com\")","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"hjuntan"},"content":" .withTag(\"Professor\").withGroups(\"friends\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"hjuntan"},"content":" public static final Person ELLE \u003d new PersonBuilder().withNusId(\"E6546506\").withName(\"Elle Meyer\")","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"hjuntan"},"content":" .withPhone(\"9482224\").withEmail(\"werner@example.com\")","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"hjuntan"},"content":" .withTag(\"TA\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"hjuntan"},"content":" public static final Person FIONA \u003d new PersonBuilder().withNusId(\"E5419832\").withName(\"Fiona Kunz\")","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"hjuntan"},"content":" .withPhone(\"9482427\").withEmail(\"lydia@example.com\").withTag(\"None\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"hjuntan"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withNusId(\"E3548135\").withName(\"George Best\")","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":" .withPhone(\"9482442\").withEmail(\"anna@example.com\").withTag(\"Student\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":50,"author":{"gitId":"hjuntan"},"content":" public static final Person HOON \u003d new PersonBuilder().withNusId(\"E3518132\").withName(\"Hoon Meier\")","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"hjuntan"},"content":" .withPhone(\"8482424\").withEmail(\"stefan@example.com\").withTag(\"Student\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"hjuntan"},"content":" public static final Person IDA \u003d new PersonBuilder().withNusId(\"E9842465\").withName(\"Ida Mueller\")","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"hjuntan"},"content":" .withPhone(\"8482131\").withEmail(\"hans@example.com\").withTag(\"None\").build();","lastModifiedDate":"2024-03-11"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":56,"author":{"gitId":"hjuntan"},"content":" public static final Person AMY \u003d new PersonBuilder().withNusId(VALID_NUSID_AMY).withName(VALID_NAME_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":57,"author":{"gitId":"hjuntan"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY)","lastModifiedDate":"2024-03-11"},{"lineNumber":58,"author":{"gitId":"hjuntan"},"content":" .withTag(VALID_TAG_AMY).withGroups(VALID_GROUP_FRIEND).build();","lastModifiedDate":"2024-03-11"},{"lineNumber":59,"author":{"gitId":"hjuntan"},"content":" public static final Person BOB \u003d new PersonBuilder().withNusId(VALID_NUSID_BOB).withName(VALID_NAME_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":60,"author":{"gitId":"hjuntan"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-03-11"},{"lineNumber":61,"author":{"gitId":"hjuntan"},"content":" .withTag(VALID_TAG_BOB).withGroups(VALID_GROUP_HUSBAND, VALID_GROUP_FRIEND)","lastModifiedDate":"2024-03-11"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":74,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"hjuntan":34,"-":48}}] diff --git a/AY2324S2-CS2103T-T15-2_tp_master/commits.json b/AY2324S2-CS2103T-T15-2_tp_master/commits.json index 07366bf2..44c7d38b 100644 --- a/AY2324S2-CS2103T-T15-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T15-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"cheahTJ":[{"date":"2024-03-05","commitResults":[{"hash":"6aa8e4b987ee24b281f6b775c458cde82c6c9e7b","isMergeCommit":false,"messageTitle":"Edit READMe and AboutUs md files","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":304,"deletions":38}}},{"hash":"b3d896e6a963cfb67ad9a6455474e0f49c5fa482","isMergeCommit":false,"messageTitle":"Fix CI issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"1b032295a55797d4f976ec6f69d8ac7ca6c6aa2f","isMergeCommit":false,"messageTitle":"Edit README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}},{"hash":"173b7df17e870e38ed0e91f86eb761dd6583554a","isMergeCommit":false,"messageTitle":"Create Nusid class to standardise its usage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":58,"deletions":0}}},{"hash":"be55639426b66a66398cb451156497c61075652e","isMergeCommit":false,"messageTitle":"Fix CI issue for Nusid class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":2}}},{"hash":"bc93ebfa00c365269e6b8576c5ed6b51328ae651","isMergeCommit":false,"messageTitle":"Rename Nusid class to NusId class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}},{"hash":"5042b0450aac5a92996b7f4221d2973d9db93eb5","isMergeCommit":false,"messageTitle":"Rename NusId.class file","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6db48455016f0c2ab57f350f8ee8333cac44a8ee","isMergeCommit":false,"messageTitle":"Edit README.md file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}}]}],"Rikko1204":[{"date":"2024-02-28","commitResults":[{"hash":"9c0f64872538fe837c0ea08b11c2e5d910257d6c","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T15-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"2f9d1510235b6e6a081ac022d3e186c38096ad60","isMergeCommit":false,"messageTitle":"Add MarkBind config","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"40f51af29c3bc5b49329f4959d7f83db4347c2fc","isMergeCommit":true,"messageTitle":"Merge pull request #3 from Rikko1204/master","messageBody":"Add MarkBind config","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d29bb35976aeeccff228a14ebc18ec7edea2334e","isMergeCommit":true,"messageTitle":"Merge pull request #13 from hjuntan/edit-Dev-Guide","messageBody":"Update Non-Functional Requirements in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"18f87bd8fe98aa8640117e03a1210609c315df62","isMergeCommit":false,"messageTitle":"Update Glossary in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"72e837bfc57da46d8fee8a03f651ac3c7369e6e7","isMergeCommit":true,"messageTitle":"Merge pull request #17 from cheahTJ/delete-feature","messageBody":"Create NusId class","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"7a95f1351b3141fe8b146b702e0334e986ac2798","isMergeCommit":true,"messageTitle":"Merge pull request #19 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Added NUSID class","fileTypesAndContributionMap":{}}]}],"RingoftheKing":[{"date":"2024-03-04","commitResults":[{"hash":"55c3ceb840b378f9e719ec8e18f2fa7f475abd41","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":9}}}]}],"Ragnapop":[{"date":"2024-03-04","commitResults":[{"hash":"3e48f01e00da32e22c95310d2dc3fc53e449fe64","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":162,"deletions":10}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d665df3b29b4eb95d61fdec4d1c69d6d59dcfb36","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":0}}}]}],"hjuntan":[{"date":"2024-03-05","commitResults":[{"hash":"3468524824ca48effada3aec0c987ba152171707","isMergeCommit":true,"messageTitle":"Merge pull request #11 from RingoftheKing/edit-Dev-Guide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"d9e95a54d7c9c37572a9181cc5c5bd2cadaaaffa","isMergeCommit":false,"messageTitle":"Update Non-Functional Requirements in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"5f6c18e9882d345d15ea92f821fd49d92c0fb1b8","isMergeCommit":true,"messageTitle":"Merge pull request #12 from cheahTJ/master","messageBody":"Edit READMe and AboutUs md files","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"a7f51093098a05846101b378a2412b3220e6807f","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Rikko1204/edit-DG","messageBody":"Update Glossary in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"196e271d363cea2299c43f697230b9e92c0c2d25","isMergeCommit":true,"messageTitle":"Merge pull request #10 from Ragnapop/edit-Dev-Guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"44375cad6b242709e068f7781ca6637e17a99c18","isMergeCommit":true,"messageTitle":"Merge pull request #22 from cheahTJ/documentation","messageBody":"Finetune README","fileTypesAndContributionMap":{}},{"hash":"52c6f2f8039e9cca676814d0ff6ed13349059566","isMergeCommit":true,"messageTitle":"Merge pull request #23 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Documentation 1.1","fileTypesAndContributionMap":{}},{"hash":"39085e81b04b1da380b83e0549e8fbdd752bbbe2","isMergeCommit":false,"messageTitle":"Tweak missing criterias","messageBody":"Group images, CI status are updated to the correct format.\nProject scope is updated to fit the tp project.\n","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":5}}},{"hash":"a34d65e8fd5b8f90822147e0926e6a0e21534258","isMergeCommit":true,"messageTitle":"Merge pull request #25 from hjuntan/documentation","messageBody":"Documentation","fileTypesAndContributionMap":{}},{"hash":"a71646d2d34723d2343cb794b25c003c8ba0295a","isMergeCommit":true,"messageTitle":"Merge pull request #26 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Documentation 1.1","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"cheahTJ":{"docs":312,"functional-code":62,"test-code":0},"Rikko1204":{"docs":6,"functional-code":0,"test-code":0},"RingoftheKing":{"docs":16,"functional-code":0,"test-code":0},"Ragnapop":{"docs":171,"functional-code":0,"test-code":0},"hjuntan":{"docs":12,"functional-code":0,"test-code":0}},"authorContributionVariance":{"cheahTJ":8100.816,"Rikko1204":8.066326,"RingoftheKing":59.693882,"Ragnapop":1965.0612,"hjuntan":12.816325},"authorDisplayNameMap":{"cheahTJ":"CS2103T-T15-2 CHEA..JUEN","Rikko1204":"CS2103T-T15-2 CHEN.. MIN","RingoftheKing":"CS2103T-T15-2 GUO ..UHAO","Ragnapop":"CS2103T-T15-2 LOH .. HUN","hjuntan":"CS2103T-T15-2 TAN .. JUN"}} +{"authorDailyContributionsMap":{"cheahTJ":[{"date":"2024-03-05","commitResults":[{"hash":"6aa8e4b987ee24b281f6b775c458cde82c6c9e7b","isMergeCommit":false,"messageTitle":"Edit READMe and AboutUs md files","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":304,"deletions":38}}},{"hash":"b3d896e6a963cfb67ad9a6455474e0f49c5fa482","isMergeCommit":false,"messageTitle":"Fix CI issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"1b032295a55797d4f976ec6f69d8ac7ca6c6aa2f","isMergeCommit":false,"messageTitle":"Edit README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}},{"hash":"173b7df17e870e38ed0e91f86eb761dd6583554a","isMergeCommit":false,"messageTitle":"Create Nusid class to standardise its usage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":58,"deletions":0}}},{"hash":"be55639426b66a66398cb451156497c61075652e","isMergeCommit":false,"messageTitle":"Fix CI issue for Nusid class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":2}}},{"hash":"bc93ebfa00c365269e6b8576c5ed6b51328ae651","isMergeCommit":false,"messageTitle":"Rename Nusid class to NusId class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}},{"hash":"5042b0450aac5a92996b7f4221d2973d9db93eb5","isMergeCommit":false,"messageTitle":"Rename NusId.class file","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6db48455016f0c2ab57f350f8ee8333cac44a8ee","isMergeCommit":false,"messageTitle":"Edit README.md file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}}]},{"date":"2024-03-12","commitResults":[{"hash":"87968ee5b1af4d7a92f77f5839d4683b2d4965c9","isMergeCommit":true,"messageTitle":"Merge pull request #32 from hjuntan/edit-person","messageBody":"Edit person fields","fileTypesAndContributionMap":{}}]}],"Rikko1204":[{"date":"2024-02-28","commitResults":[{"hash":"9c0f64872538fe837c0ea08b11c2e5d910257d6c","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T15-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"2f9d1510235b6e6a081ac022d3e186c38096ad60","isMergeCommit":false,"messageTitle":"Add MarkBind config","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"40f51af29c3bc5b49329f4959d7f83db4347c2fc","isMergeCommit":true,"messageTitle":"Merge pull request #3 from Rikko1204/master","messageBody":"Add MarkBind config","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d29bb35976aeeccff228a14ebc18ec7edea2334e","isMergeCommit":true,"messageTitle":"Merge pull request #13 from hjuntan/edit-Dev-Guide","messageBody":"Update Non-Functional Requirements in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"18f87bd8fe98aa8640117e03a1210609c315df62","isMergeCommit":false,"messageTitle":"Update Glossary in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"72e837bfc57da46d8fee8a03f651ac3c7369e6e7","isMergeCommit":true,"messageTitle":"Merge pull request #17 from cheahTJ/delete-feature","messageBody":"Create NusId class","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"7a95f1351b3141fe8b146b702e0334e986ac2798","isMergeCommit":true,"messageTitle":"Merge pull request #19 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Added NUSID class","fileTypesAndContributionMap":{}}]}],"RingoftheKing":[{"date":"2024-03-04","commitResults":[{"hash":"55c3ceb840b378f9e719ec8e18f2fa7f475abd41","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":9}}}]}],"Ragnapop":[{"date":"2024-03-04","commitResults":[{"hash":"3e48f01e00da32e22c95310d2dc3fc53e449fe64","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":162,"deletions":10}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d665df3b29b4eb95d61fdec4d1c69d6d59dcfb36","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":0}}}]}],"hjuntan":[{"date":"2024-03-05","commitResults":[{"hash":"3468524824ca48effada3aec0c987ba152171707","isMergeCommit":true,"messageTitle":"Merge pull request #11 from RingoftheKing/edit-Dev-Guide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"d9e95a54d7c9c37572a9181cc5c5bd2cadaaaffa","isMergeCommit":false,"messageTitle":"Update Non-Functional Requirements in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"5f6c18e9882d345d15ea92f821fd49d92c0fb1b8","isMergeCommit":true,"messageTitle":"Merge pull request #12 from cheahTJ/master","messageBody":"Edit READMe and AboutUs md files","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"a7f51093098a05846101b378a2412b3220e6807f","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Rikko1204/edit-DG","messageBody":"Update Glossary in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"196e271d363cea2299c43f697230b9e92c0c2d25","isMergeCommit":true,"messageTitle":"Merge pull request #10 from Ragnapop/edit-Dev-Guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"44375cad6b242709e068f7781ca6637e17a99c18","isMergeCommit":true,"messageTitle":"Merge pull request #22 from cheahTJ/documentation","messageBody":"Finetune README","fileTypesAndContributionMap":{}},{"hash":"52c6f2f8039e9cca676814d0ff6ed13349059566","isMergeCommit":true,"messageTitle":"Merge pull request #23 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Documentation 1.1","fileTypesAndContributionMap":{}},{"hash":"39085e81b04b1da380b83e0549e8fbdd752bbbe2","isMergeCommit":false,"messageTitle":"Tweak missing criterias","messageBody":"Group images, CI status are updated to the correct format.\nProject scope is updated to fit the tp project.\n","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":5}}},{"hash":"a34d65e8fd5b8f90822147e0926e6a0e21534258","isMergeCommit":true,"messageTitle":"Merge pull request #25 from hjuntan/documentation","messageBody":"Documentation","fileTypesAndContributionMap":{}},{"hash":"a71646d2d34723d2343cb794b25c003c8ba0295a","isMergeCommit":true,"messageTitle":"Merge pull request #26 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Documentation 1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"69b799bcde5f1ede5bf0ce10d585f2ebeafa4391","isMergeCommit":false,"messageTitle":"Change tags to groups","messageBody":"Tags are now represented as groups, tutorial groups\nA person can be assigned for multilple groups.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":207,"deletions":207},"test-code":{"insertions":175,"deletions":175}}},{"hash":"456e8e744f68d783858a118761afa48044cbc22e","isMergeCommit":false,"messageTitle":"Add tags and remove address","messageBody":"Tags are the following value: Student, TA, Professor, None.\nTags are case-sensitive. (Top be improved on)\nAble to easily distinguish between the people in the address book.\n\nAddresses are removed as we deemed it as unnecessary information\nfor our target user.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":178,"deletions":136},"test-code":{"insertions":203,"deletions":203}}},{"hash":"e267bf3b3d86cd0de42b98060ea07ac99120058d","isMergeCommit":false,"messageTitle":"Add new field: NUSID","messageBody":"Each person has an NUSID field which is uniquely identifies the person.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":45,"deletions":14},"test-code":{"insertions":46,"deletions":24}}},{"hash":"1dcb59af4e036f80aa2d6a7a60e9ea2474ffa3ef","isMergeCommit":false,"messageTitle":"Fix checkstyle errors","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":41,"deletions":21}}},{"hash":"f658135cdd2e75039ba69ec9dbcc1aa0c7e6e0ee","isMergeCommit":false,"messageTitle":"More fixes to checkstyle error","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":8}}},{"hash":"a54ae5be60faaaa64961890077346e51a76e8882","isMergeCommit":false,"messageTitle":"Fix checkstyle error for test files","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":73,"deletions":62}}},{"hash":"61a6347088c1e9ec43b3bf2a308d19549f84d658","isMergeCommit":false,"messageTitle":"More fixes to checkstyle error for test files","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":20,"deletions":20}}}]},{"date":"2024-03-12","commitResults":[{"hash":"d3ed7cddc1fdf3c4b19b72400b5736f522bc3412","isMergeCommit":false,"messageTitle":"Fix json formatting","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":4,"deletions":2}}},{"hash":"328ee51f9758948f6ddd34e53c64663c906508af","isMergeCommit":true,"messageTitle":"Merge pull request #44 from AY2324S2-CS2103T-T15-2/edit-person-class","messageBody":"Edit person class","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"cheahTJ":{"docs":312,"functional-code":61,"test-code":0},"Rikko1204":{"docs":6,"functional-code":0,"test-code":0},"RingoftheKing":{"docs":16,"functional-code":0,"test-code":0},"Ragnapop":{"docs":171,"functional-code":0,"test-code":0},"hjuntan":{"docs":12,"functional-code":428,"test-code":387}},"authorContributionVariance":{"cheahTJ":6162.2983,"Rikko1204":6.110804,"RingoftheKing":44.87536,"Ragnapop":1487.5121,"hjuntan":173357.7},"authorDisplayNameMap":{"cheahTJ":"CS2103T-T15-2 CHEA..JUEN","Rikko1204":"CS2103T-T15-2 CHEN.. MIN","RingoftheKing":"CS2103T-T15-2 GUO ..UHAO","Ragnapop":"CS2103T-T15-2 LOH .. HUN","hjuntan":"CS2103T-T15-2 TAN .. JUN"}} diff --git a/AY2324S2-CS2103T-T16-2_tp_master/authorship.json b/AY2324S2-CS2103T-T16-2_tp_master/authorship.json index 70892981..c0f29935 100644 --- a/AY2324S2-CS2103T-T16-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T16-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"zhekaiii"},"content":"### Lim Zhekai","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"zhekaiii"},"content":"\u003cimg src\u003d\"images/zhekaiii.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"zhekaiii"},"content":"[[github](https://github.com/zhekaiii)]","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"zhekaiii"},"content":"[[portfolio](team/zhekaiii.md)]","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"zhekaiii"},"content":"* Role: Developer","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"zhekaiii"},"content":"* Responsibilities: Code Reviews \u0026 Backend","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"alvinnzz"},"content":"### Alvin Ng","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"alvinnzz"},"content":"\u003cimg src\u003d\"images/alvinnzz.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"alvinnzz"},"content":"[[github](http://github.com/alvinnzz)]","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"alvinnzz"},"content":"[[portfolio](team/alvinnzz.md)]","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"alvinnzz"},"content":"* Role: Developer","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"alvinnzz"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"alvinnzz"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-10"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"alvinnzz":7,"-":37,"zhekaiii":6}},{"path":"docs/team/alvinnzz.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"alvinnzz"},"content":"---","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"zhekaiii"},"content":"layout: page","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"alvinnzz"},"content":"title: Alvin Ng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"alvinnzz"},"content":"---","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"alvinnzz"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"zhekaiii"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"zhekaiii"},"content":"interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"alvinnzz"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"alvinnzz"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"zhekaiii"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"zhekaiii"},"content":" by using the redo command.","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"zhekaiii"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"zhekaiii"},"content":" the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"zhekaiii"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"zhekaiii"},"content":" analysis of design alternatives. The implementation too was challenging as it required changes to existing","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"zhekaiii"},"content":" commands.","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"zhekaiii"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"zhekaiii"},"content":" the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"alvinnzz"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"alvinnzz"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"alvinnzz"},"content":"* **Project management**:","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"alvinnzz"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"alvinnzz"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"alvinnzz"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"zhekaiii"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"zhekaiii"},"content":" requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":36,"author":{"gitId":"alvinnzz"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-10"},{"lineNumber":37,"author":{"gitId":"alvinnzz"},"content":" * User Guide:","lastModifiedDate":"2024-03-10"},{"lineNumber":38,"author":{"gitId":"alvinnzz"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-10"},{"lineNumber":39,"author":{"gitId":"alvinnzz"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-10"},{"lineNumber":40,"author":{"gitId":"alvinnzz"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-10"},{"lineNumber":41,"author":{"gitId":"alvinnzz"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":43,"author":{"gitId":"alvinnzz"},"content":"* **Community**:","lastModifiedDate":"2024-03-10"},{"lineNumber":44,"author":{"gitId":"alvinnzz"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-10"},{"lineNumber":45,"author":{"gitId":"alvinnzz"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"alvinnzz"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-10"},{"lineNumber":47,"author":{"gitId":"alvinnzz"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-10"},{"lineNumber":48,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":49,"author":{"gitId":"alvinnzz"},"content":"* **Tools**:","lastModifiedDate":"2024-03-10"},{"lineNumber":50,"author":{"gitId":"alvinnzz"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"alvinnzz"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":53,"author":{"gitId":"alvinnzz"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-10"}],"authorContributionMap":{"alvinnzz":39,"zhekaiii":14}},{"path":"docs/team/zhekaiii.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"zhekaiii"},"content":"---","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"zhekaiii"},"content":"layout: page","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"zhekaiii"},"content":"title: Zhekai\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"zhekaiii"},"content":"---","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"zhekaiii"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"zhekaiii"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"zhekaiii"},"content":"interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"zhekaiii"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"zhekaiii"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"zhekaiii"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"zhekaiii"},"content":" by using the redo command.","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"zhekaiii"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"zhekaiii"},"content":" the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"zhekaiii"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"zhekaiii"},"content":" analysis of design alternatives. The implementation too was challenging as it required changes to existing","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"zhekaiii"},"content":" commands.","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"zhekaiii"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"zhekaiii"},"content":" the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"zhekaiii"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"zhekaiii"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"zhekaiii"},"content":"* **Project management**:","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"zhekaiii"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"zhekaiii"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"zhekaiii"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"zhekaiii"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"zhekaiii"},"content":" requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"zhekaiii"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"zhekaiii"},"content":" * User Guide:","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"zhekaiii"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"zhekaiii"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"zhekaiii"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"zhekaiii"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"zhekaiii"},"content":"* **Community**:","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"zhekaiii"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"zhekaiii"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"zhekaiii"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"zhekaiii"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"zhekaiii"},"content":"* **Tools**:","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"zhekaiii"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"zhekaiii"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"zhekaiii"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"zhekaiii":53}}] +[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"zhekaiii"},"content":"### Lim Zhekai","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"zhekaiii"},"content":"\u003cimg src\u003d\"images/zhekaiii.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"zhekaiii"},"content":"[[github](https://github.com/zhekaiii)]","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"zhekaiii"},"content":"[[portfolio](team/zhekaiii.md)]","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"zhekaiii"},"content":"* Role: Developer","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"zhekaiii"},"content":"* Responsibilities: Code Reviews \u0026 Backend","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"alvinnzz"},"content":"### Alvin Ng","lastModifiedDate":"2024-03-10"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"alvinnzz"},"content":"\u003cimg src\u003d\"images/alvinnzz.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"alvinnzz"},"content":"[[github](http://github.com/alvinnzz)]","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"alvinnzz"},"content":"[[portfolio](team/alvinnzz.md)]","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"alvinnzz"},"content":"* Role: Developer","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"alvinnzz"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"JerryO3"},"content":"### Oon Jie Rui","lastModifiedDate":"2024-03-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":34,"author":{"gitId":"JerryO3"},"content":"\u003cimg src\u003d\"images/jerryo3.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":36,"author":{"gitId":"JerryO3"},"content":"[[github](https://github.com/jerryo3)]","lastModifiedDate":"2024-03-12"},{"lineNumber":37,"author":{"gitId":"JerryO3"},"content":"[[portfolio](team/jerryo3.md)]","lastModifiedDate":"2024-03-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-12"},{"lineNumber":40,"author":{"gitId":"JerryO3"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"alvinnzz"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"alvinnzz":7,"JerryO3":5,"-":42,"zhekaiii":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"JerryO3"},"content":"NUS students who want to coordinate weekly meetup sessions for meals/activities","lastModifiedDate":"2024-03-11"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"JerryO3"},"content":"* would like to know who is available on a particular day of the week","lastModifiedDate":"2024-03-11"},{"lineNumber":272,"author":{"gitId":"JerryO3"},"content":"* would like to know how much he owes to/is owed by his contacts","lastModifiedDate":"2024-03-11"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"JerryO3"},"content":"**Value proposition**: FriendFolio tailors the contact management experience just for students. It streamlines connections, enhances academic collaborations, and fosters a vibrant community within their reach. FriendFolio elevates the networking game, making every interaction meaningful.","lastModifiedDate":"2024-03-11"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"JerryO3"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ | Notes |","lastModifiedDate":"2024-03-11"},{"lineNumber":282,"author":{"gitId":"JerryO3"},"content":"|----------|--------------------------------------------|-------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|----------------------------|","lastModifiedDate":"2024-03-11"},{"lineNumber":283,"author":{"gitId":"JerryO3"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App | |","lastModifiedDate":"2024-03-11"},{"lineNumber":284,"author":{"gitId":"JerryO3"},"content":"| `* * *` | user | add a new person | | |","lastModifiedDate":"2024-03-11"},{"lineNumber":285,"author":{"gitId":"JerryO3"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need | |","lastModifiedDate":"2024-03-11"},{"lineNumber":286,"author":{"gitId":"JerryO3"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list | |","lastModifiedDate":"2024-03-11"},{"lineNumber":287,"author":{"gitId":"JerryO3"},"content":"| `* * *` | user | view person\u0027s information | | |","lastModifiedDate":"2024-03-11"},{"lineNumber":288,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident | |","lastModifiedDate":"2024-03-11"},{"lineNumber":289,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | store days that my contacts are in school | see who is free to meet up | |","lastModifiedDate":"2024-03-11"},{"lineNumber":290,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | store the phone numbers of our contacts | be able to call our contacts | |","lastModifiedDate":"2024-03-11"},{"lineNumber":291,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | store address | be able to visit them | |","lastModifiedDate":"2024-03-11"},{"lineNumber":292,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | store tags | be able to store miscellaneous information about them | |","lastModifiedDate":"2024-03-11"},{"lineNumber":293,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | store email | email them | |","lastModifiedDate":"2024-03-11"},{"lineNumber":294,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | store money owed | remember who owes me money | |","lastModifiedDate":"2024-03-11"},{"lineNumber":295,"author":{"gitId":"JerryO3"},"content":"| `* *` | forgetful user | store birthdays of my contacts | not forget when their birthdays are | |","lastModifiedDate":"2024-03-11"},{"lineNumber":296,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | store uncategorized information under a field | remember other information that may not be captured in the existing list of fields | “newton doesn’t eat beef” |","lastModifiedDate":"2024-03-11"},{"lineNumber":297,"author":{"gitId":"JerryO3"},"content":"| `* *` | user | edit person\u0027s information | correct mistakes made when I added the contact | |","lastModifiedDate":"2024-03-11"},{"lineNumber":298,"author":{"gitId":"JerryO3"},"content":"| `* *` | user with many persons in the address book | sort persons by name | locate a person easily | |","lastModifiedDate":"2024-03-11"},{"lineNumber":299,"author":{"gitId":"JerryO3"},"content":"| `*` | user | filter contacts by tags | find contacts of specific categories such as family, friends | |","lastModifiedDate":"2024-03-11"},{"lineNumber":300,"author":{"gitId":"JerryO3"},"content":"| `*` | user | update money owed | | |","lastModifiedDate":"2024-03-11"},{"lineNumber":301,"author":{"gitId":"JerryO3"},"content":"| `*` | user | sort contacts by money owed | look at who owes me the most money | |","lastModifiedDate":"2024-03-11"},{"lineNumber":302,"author":{"gitId":"JerryO3"},"content":"| `*` | user | sort contacts by birthdays | remember to wish the person for his birthday | |","lastModifiedDate":"2024-03-11"},{"lineNumber":303,"author":{"gitId":"JerryO3"},"content":"| `*` | user | filter contacts by days that my contacts are in school | see who is free to meet up more easily | |","lastModifiedDate":"2024-03-11"},{"lineNumber":304,"author":{"gitId":"JerryO3"},"content":"| `*` | user | be warned of creating contacts with duplicate phone numbers | to avoid making duplicate contacts | |","lastModifiedDate":"2024-03-11"},{"lineNumber":305,"author":{"gitId":"JerryO3"},"content":"| `*` | user | share/export my contacts | back them up or share them with others | |","lastModifiedDate":"2024-03-11"},{"lineNumber":306,"author":{"gitId":"JerryO3"},"content":"| `*` | user | store profile pictures of my contacts | quickly identify and remember my contact | |","lastModifiedDate":"2024-03-11"},{"lineNumber":307,"author":{"gitId":"JerryO3"},"content":"| `*` | user | see what is the total amount owed to me/i owe to my contacts | start paying up/ asking others to pay stuff for me | |","lastModifiedDate":"2024-03-11"},{"lineNumber":308,"author":{"gitId":"JerryO3"},"content":"| `*` | experienced user | use quick keyboard shortcuts to perform all the implemented functions above | use the address book more efficiently | |","lastModifiedDate":"2024-03-11"},{"lineNumber":309,"author":{"gitId":"JerryO3"},"content":"| `*` | new user | input contact information into multiple separate input fields (instead of entering one command) | i can avoid making mistakes by not being familiar with the command format | |","lastModifiedDate":"2024-03-11"},{"lineNumber":310,"author":{"gitId":"JerryO3"},"content":"| `*` | user | pin starred contacts at the top of the address book | quickly access my favorite contacts | |","lastModifiedDate":"2024-03-11"},{"lineNumber":311,"author":{"gitId":"JerryO3"},"content":"| `*` | user | access my search history on the search bar | quickly access recent searches | |","lastModifiedDate":"2024-03-11"},{"lineNumber":312,"author":{"gitId":"JerryO3"},"content":"| `*` | user | store incomplete contacts as drafts | return to my incomplete contacts to finish them up after any disruption without losing existing keyed-in information | |","lastModifiedDate":"2024-03-11"},{"lineNumber":313,"author":{"gitId":"JerryO3"},"content":"| `*` | user | access my desired contacts via autocomplete in the search bar | efficiently access my contacts in the address book | |","lastModifiedDate":"2024-03-11"},{"lineNumber":314,"author":{"gitId":"JerryO3"},"content":"| `*` | experienced user | add multiple contacts with one input | efficiently use the address book | |","lastModifiedDate":"2024-03-11"},{"lineNumber":315,"author":{"gitId":"JerryO3"},"content":"| `*` | user | remove starred contacts from the top of the address book | remove contacts i no longer want to pin | |","lastModifiedDate":"2024-03-11"},{"lineNumber":316,"author":{"gitId":"JerryO3"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":317,"author":{"gitId":"JerryO3"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":361,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"JerryO3":41,"-":373}},{"path":"docs/team/alvinnzz.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"alvinnzz"},"content":"---","lastModifiedDate":"2024-03-10"},{"lineNumber":2,"author":{"gitId":"zhekaiii"},"content":"layout: page","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"alvinnzz"},"content":"title: Alvin Ng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-10"},{"lineNumber":4,"author":{"gitId":"alvinnzz"},"content":"---","lastModifiedDate":"2024-03-10"},{"lineNumber":5,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":6,"author":{"gitId":"alvinnzz"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-10"},{"lineNumber":7,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":8,"author":{"gitId":"zhekaiii"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"zhekaiii"},"content":"interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":11,"author":{"gitId":"alvinnzz"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-10"},{"lineNumber":12,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"alvinnzz"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-10"},{"lineNumber":14,"author":{"gitId":"zhekaiii"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"zhekaiii"},"content":" by using the redo command.","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"zhekaiii"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"zhekaiii"},"content":" the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"zhekaiii"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"zhekaiii"},"content":" analysis of design alternatives. The implementation too was challenging as it required changes to existing","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"zhekaiii"},"content":" commands.","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"zhekaiii"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"zhekaiii"},"content":" the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":24,"author":{"gitId":"alvinnzz"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-10"},{"lineNumber":25,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":26,"author":{"gitId":"alvinnzz"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-10"},{"lineNumber":27,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":28,"author":{"gitId":"alvinnzz"},"content":"* **Project management**:","lastModifiedDate":"2024-03-10"},{"lineNumber":29,"author":{"gitId":"alvinnzz"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-10"},{"lineNumber":30,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":31,"author":{"gitId":"alvinnzz"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-10"},{"lineNumber":32,"author":{"gitId":"alvinnzz"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-10"},{"lineNumber":33,"author":{"gitId":"zhekaiii"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"zhekaiii"},"content":" requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":36,"author":{"gitId":"alvinnzz"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-10"},{"lineNumber":37,"author":{"gitId":"alvinnzz"},"content":" * User Guide:","lastModifiedDate":"2024-03-10"},{"lineNumber":38,"author":{"gitId":"alvinnzz"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-10"},{"lineNumber":39,"author":{"gitId":"alvinnzz"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-10"},{"lineNumber":40,"author":{"gitId":"alvinnzz"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-10"},{"lineNumber":41,"author":{"gitId":"alvinnzz"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-10"},{"lineNumber":42,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":43,"author":{"gitId":"alvinnzz"},"content":"* **Community**:","lastModifiedDate":"2024-03-10"},{"lineNumber":44,"author":{"gitId":"alvinnzz"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-10"},{"lineNumber":45,"author":{"gitId":"alvinnzz"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"alvinnzz"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-10"},{"lineNumber":47,"author":{"gitId":"alvinnzz"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-10"},{"lineNumber":48,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":49,"author":{"gitId":"alvinnzz"},"content":"* **Tools**:","lastModifiedDate":"2024-03-10"},{"lineNumber":50,"author":{"gitId":"alvinnzz"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"alvinnzz"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"alvinnzz"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":53,"author":{"gitId":"alvinnzz"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-10"}],"authorContributionMap":{"alvinnzz":39,"zhekaiii":14}},{"path":"docs/team/zhekaiii.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"zhekaiii"},"content":"---","lastModifiedDate":"2024-03-11"},{"lineNumber":2,"author":{"gitId":"zhekaiii"},"content":"layout: page","lastModifiedDate":"2024-03-11"},{"lineNumber":3,"author":{"gitId":"zhekaiii"},"content":"title: Zhekai\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-11"},{"lineNumber":4,"author":{"gitId":"zhekaiii"},"content":"---","lastModifiedDate":"2024-03-11"},{"lineNumber":5,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":6,"author":{"gitId":"zhekaiii"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-11"},{"lineNumber":7,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":8,"author":{"gitId":"zhekaiii"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user","lastModifiedDate":"2024-03-11"},{"lineNumber":9,"author":{"gitId":"zhekaiii"},"content":"interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-03-11"},{"lineNumber":10,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":11,"author":{"gitId":"zhekaiii"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-11"},{"lineNumber":12,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":13,"author":{"gitId":"zhekaiii"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-11"},{"lineNumber":14,"author":{"gitId":"zhekaiii"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed","lastModifiedDate":"2024-03-11"},{"lineNumber":15,"author":{"gitId":"zhekaiii"},"content":" by using the redo command.","lastModifiedDate":"2024-03-11"},{"lineNumber":16,"author":{"gitId":"zhekaiii"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and","lastModifiedDate":"2024-03-11"},{"lineNumber":17,"author":{"gitId":"zhekaiii"},"content":" the app should provide a convenient way to rectify them.","lastModifiedDate":"2024-03-11"},{"lineNumber":18,"author":{"gitId":"zhekaiii"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth","lastModifiedDate":"2024-03-11"},{"lineNumber":19,"author":{"gitId":"zhekaiii"},"content":" analysis of design alternatives. The implementation too was challenging as it required changes to existing","lastModifiedDate":"2024-03-11"},{"lineNumber":20,"author":{"gitId":"zhekaiii"},"content":" commands.","lastModifiedDate":"2024-03-11"},{"lineNumber":21,"author":{"gitId":"zhekaiii"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in","lastModifiedDate":"2024-03-11"},{"lineNumber":22,"author":{"gitId":"zhekaiii"},"content":" the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-03-11"},{"lineNumber":23,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":24,"author":{"gitId":"zhekaiii"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-11"},{"lineNumber":25,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":26,"author":{"gitId":"zhekaiii"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-11"},{"lineNumber":27,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":28,"author":{"gitId":"zhekaiii"},"content":"* **Project management**:","lastModifiedDate":"2024-03-11"},{"lineNumber":29,"author":{"gitId":"zhekaiii"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-11"},{"lineNumber":30,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":31,"author":{"gitId":"zhekaiii"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-11"},{"lineNumber":32,"author":{"gitId":"zhekaiii"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-11"},{"lineNumber":33,"author":{"gitId":"zhekaiii"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull","lastModifiedDate":"2024-03-11"},{"lineNumber":34,"author":{"gitId":"zhekaiii"},"content":" requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-11"},{"lineNumber":35,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":36,"author":{"gitId":"zhekaiii"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-11"},{"lineNumber":37,"author":{"gitId":"zhekaiii"},"content":" * User Guide:","lastModifiedDate":"2024-03-11"},{"lineNumber":38,"author":{"gitId":"zhekaiii"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-11"},{"lineNumber":39,"author":{"gitId":"zhekaiii"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-11"},{"lineNumber":40,"author":{"gitId":"zhekaiii"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-11"},{"lineNumber":41,"author":{"gitId":"zhekaiii"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-11"},{"lineNumber":42,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":43,"author":{"gitId":"zhekaiii"},"content":"* **Community**:","lastModifiedDate":"2024-03-11"},{"lineNumber":44,"author":{"gitId":"zhekaiii"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-11"},{"lineNumber":45,"author":{"gitId":"zhekaiii"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-11"},{"lineNumber":46,"author":{"gitId":"zhekaiii"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-11"},{"lineNumber":47,"author":{"gitId":"zhekaiii"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-11"},{"lineNumber":48,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":49,"author":{"gitId":"zhekaiii"},"content":"* **Tools**:","lastModifiedDate":"2024-03-11"},{"lineNumber":50,"author":{"gitId":"zhekaiii"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-11"},{"lineNumber":51,"author":{"gitId":"zhekaiii"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-11"},{"lineNumber":52,"author":{"gitId":"zhekaiii"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":53,"author":{"gitId":"zhekaiii"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"zhekaiii":53}}] diff --git a/AY2324S2-CS2103T-T16-2_tp_master/commits.json b/AY2324S2-CS2103T-T16-2_tp_master/commits.json index af16860e..6b9204b2 100644 --- a/AY2324S2-CS2103T-T16-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T16-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"alvinnzz":[{"date":"2024-03-10","commitResults":[{"hash":"3cb1862ae444ad05d63152b41dfe9349c7318dda","isMergeCommit":false,"messageTitle":"Update about us page for Alvin","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":16}}}]},{"date":"2024-03-11","commitResults":[{"hash":"785ea150ff437637e111c4bfa8dcbb9691b482f5","isMergeCommit":true,"messageTitle":"Merge pull request #9 from zhekaiii/about-us-page","messageBody":"Update about us page for Zhekai","fileTypesAndContributionMap":{}}]}],"NewtonKoh":[],"JerryO3":[],"zhekaiii":[{"date":"2024-03-11","commitResults":[{"hash":"dbaeef15582db658a89c1ea4e9094e5445471d40","isMergeCommit":true,"messageTitle":"Merge pull request #7 from alvinnzz/about-us-page","messageBody":"Update about us page for Alvin","fileTypesAndContributionMap":{}},{"hash":"769403b653d2589bd635c334d8b21ef044c17cb5","isMergeCommit":false,"messageTitle":"Update about us page for Zhekai","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":26}}}]}]},"authorFileTypeContributionMap":{"alvinnzz":{"docs":46,"functional-code":0,"test-code":0},"NewtonKoh":{"docs":0,"functional-code":0,"test-code":0},"JerryO3":{"docs":0,"functional-code":0,"test-code":0},"zhekaiii":{"docs":73,"functional-code":0,"test-code":0}},"authorContributionVariance":{"alvinnzz":249.80553,"NewtonKoh":0.0,"JerryO3":0.0,"zhekaiii":658.17285},"authorDisplayNameMap":{"alvinnzz":"CS2103T-T16-2 NG W..LVIN","NewtonKoh":"CS2103T-T16-2 KOH ..WTON","JerryO3":"CS2103T-T16-2 OON .. RUI","zhekaiii":"CS2103T-T16-2 LIM ..EKAI"}} +{"authorDailyContributionsMap":{"alvinnzz":[{"date":"2024-03-10","commitResults":[{"hash":"3cb1862ae444ad05d63152b41dfe9349c7318dda","isMergeCommit":false,"messageTitle":"Update about us page for Alvin","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":16}}}]},{"date":"2024-03-11","commitResults":[{"hash":"785ea150ff437637e111c4bfa8dcbb9691b482f5","isMergeCommit":true,"messageTitle":"Merge pull request #9 from zhekaiii/about-us-page","messageBody":"Update about us page for Zhekai","fileTypesAndContributionMap":{}}]}],"NewtonKoh":[],"JerryO3":[{"date":"2024-03-11","commitResults":[{"hash":"5ca183da1c65e3d08813bde227d207df383ab19a","isMergeCommit":false,"messageTitle":"Add User Stories, User Profile and Value Proposition as per team doc","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":41,"deletions":9}}},{"hash":"a2eece09935c8fda66fb20d88ef84b61e0444700","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/JerryO3/tp","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-12","commitResults":[{"hash":"818031c60aef3b2a5a7344505c96083970db343d","isMergeCommit":false,"messageTitle":"Add picture in about us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}}]}],"zhekaiii":[{"date":"2024-03-11","commitResults":[{"hash":"dbaeef15582db658a89c1ea4e9094e5445471d40","isMergeCommit":true,"messageTitle":"Merge pull request #7 from alvinnzz/about-us-page","messageBody":"Update about us page for Alvin","fileTypesAndContributionMap":{}},{"hash":"769403b653d2589bd635c334d8b21ef044c17cb5","isMergeCommit":false,"messageTitle":"Update about us page for Zhekai","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":26}}}]},{"date":"2024-03-12","commitResults":[{"hash":"755f91327c388fa27f116582a9a8bb94010faca5","isMergeCommit":true,"messageTitle":"Merge pull request #11 from JerryO3/about-us-update","messageBody":"AboutUs update","fileTypesAndContributionMap":{}},{"hash":"39a470a27d0aa0ff512807782a736bc087263e92","isMergeCommit":true,"messageTitle":"Merge pull request #12 from JerryO3/DG-update","messageBody":"Add User Stories, User Profile and Value Proposition as per team doc","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"alvinnzz":{"docs":46,"functional-code":0,"test-code":0},"NewtonKoh":{"docs":0,"functional-code":0,"test-code":0},"JerryO3":{"docs":46,"functional-code":0,"test-code":0},"zhekaiii":{"docs":73,"functional-code":0,"test-code":0}},"authorContributionVariance":{"alvinnzz":237.3906,"NewtonKoh":0.0,"JerryO3":126.86981,"zhekaiii":625.4626},"authorDisplayNameMap":{"alvinnzz":"CS2103T-T16-2 NG W..LVIN","NewtonKoh":"CS2103T-T16-2 KOH ..WTON","JerryO3":"CS2103T-T16-2 OON .. RUI","zhekaiii":"CS2103T-T16-2 LIM ..EKAI"}} diff --git a/AY2324S2-CS2103T-W08-3_tp_master/authorship.json b/AY2324S2-CS2103T-W08-3_tp_master/authorship.json index 213be2f0..61918700 100644 --- a/AY2324S2-CS2103T-W08-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W08-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp/graph/badge.svg?token\u003dNSJUXEXG4R)](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp)","lastModifiedDate":"2024-02-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"wilsonwid"},"content":"* This is **a project to help make us students able to easily to manage our contacts.**\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":" * recall a classmate\u0027s project role","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":" * schedule a meeting with a study group","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"* The project aims to alleviate the common challenge of remembering and managing the myriad of connections we accumulate, especially in academic and professional settings.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"wilsonwid"},"content":" * It is **written in an object-oriented programming (OOP) fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" * It provides a user and developer guide.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wilsonwid"},"content":"* It is named `Student Contact Manager` because it helps students to store contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ChuaZiLong"},"content":"* For the detailed documentation of this project, see the **[Student Contact Manager Website](https://ay2324s2-cs2103t-w08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"ChuaZiLong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":4,"-":5,"ChuaZiLong":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wilsonwid"},"content":"### Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wilsonwid"},"content":"\u003cimg src\u003d\"images/wilsonwid.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"wilsonwid"},"content":"[[github](https://github.com/wilsonwid)]","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"wilsonwid"},"content":"[[portfolio](team/wilsonwid.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"wilsonwid"},"content":"* Role: Team leader, Developer","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"wilsonwid"},"content":"* Responsibilities: Importing data, DevOps, User Guide, Developer Guide","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"ChuaZiLong"},"content":"### Chua Zi Long","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"ChuaZiLong"},"content":"\u003cimg src\u003d\"images/chuazilong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"ChuaZiLong"},"content":"[[github](https://github.com/ChuaZiLong)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"ChuaZiLong"},"content":"[[portfolio](team/zilong.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"ChuaZiLong"},"content":"* Responsibilities: README + Site-wide Settings + Exporting Data","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":6,"-":50,"ChuaZiLong":5}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wilsonwid"},"content":"* proficient with the use of a computer","lastModifiedDate":"2024-03-10"},{"lineNumber":283,"author":{"gitId":"wilsonwid"},"content":"* seeks an efficient way to manage a significant number of contacts within their academic and professional circles","lastModifiedDate":"2024-03-10"},{"lineNumber":284,"author":{"gitId":"wilsonwid"},"content":"* has a busy schedule","lastModifiedDate":"2024-03-10"},{"lineNumber":285,"author":{"gitId":"wilsonwid"},"content":"* desires an interactive and responsive app","lastModifiedDate":"2024-03-10"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"wilsonwid"},"content":"**Value proposition**: manage contacts and schedules faster and more effectively than with a normal scheduling app.","lastModifiedDate":"2024-03-10"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"ChuaZiLong"},"content":"| `* * *` | user | search for a contact | find their information when I need it. |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"ChuaZiLong"},"content":"| `* * *` | user | import contact information | easily add multiple contacts at once. |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"ChuaZiLong"},"content":"| `* * *` | user | export contacts | easily integrate existing data. |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"ChuaZiLong"},"content":"**Use case: `find_by_tag`**","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"ChuaZiLong"},"content":"1. User requests to search for users by a specific tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"ChuaZiLong"},"content":"2. The application displays a list of users who are tagged with the specified tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"ChuaZiLong"},"content":"3. User reviews the list to find the desired contact(s).","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"ChuaZiLong"},"content":"2a. No users are found with the given tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"ChuaZiLong"},"content":"2a1. The application notifies the user that no contacts were found with the specified tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"ChuaZiLong"},"content":"1a. The user enters extra spaces before or after the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"ChuaZiLong"},"content":"1a1. The application automatically trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"ChuaZiLong"},"content":"1b. The user specifies multiple tags or incorrect parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"ChuaZiLong"},"content":"1b1. The application shows an error message and instructions for correct input format.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"ChuaZiLong"},"content":"**Use case: `find_and_export`**","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"ChuaZiLong"},"content":"1. User requests to search for users by a specific tag and optionally by name and/or address, and export the results.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"ChuaZiLong"},"content":"2. The application filters the users according to the given criteria and displays the filtered list.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"ChuaZiLong"},"content":"3. The application exports the filtered list to a specified file or a default file if no filename is provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"ChuaZiLong"},"content":"4. The application notifies the user that the export was successful.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"ChuaZiLong"},"content":"2a. No users match the given criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"ChuaZiLong"},"content":"2a1. The application alerts the user that no matching contacts were found.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"ChuaZiLong"},"content":"3a. The user specifies an invalid filename or multiple filenames.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"ChuaZiLong"},"content":"3a1. The application shows an error message regarding the filename issue.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ChuaZiLong"},"content":"1a. The user includes extra spaces in the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"ChuaZiLong"},"content":"1a1. The application trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"ChuaZiLong"},"content":"**Use case: `import`**","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"ChuaZiLong"},"content":"1. User requests to import contacts from one or multiple JSON files located in the ./data/ directory.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"ChuaZiLong"},"content":"2. The application validates the existence and format of the specified file(s).","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"ChuaZiLong"},"content":"3. The application imports the contacts from the file(s) into the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"ChuaZiLong"},"content":"4. The application notifies the user that the import was successful.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"ChuaZiLong"},"content":"2a. One or more specified files do not exist in the ./data/ directory.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"ChuaZiLong"},"content":"2a1. The application informs the user which files could not be found.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"ChuaZiLong"},"content":"2b. One or more files are not in the correct JSON format.","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"ChuaZiLong"},"content":"2b1. The application notifies the user which files have format issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"ChuaZiLong"},"content":"1a. The user includes extra spaces in the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"ChuaZiLong"},"content":"1a1. The application trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"ChuaZiLong"},"content":"Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"ChuaZiLong"},"content":"3. Designed for users who can type fast, making command execution quicker than using a mouse.","lastModifiedDate":"2024-02-24"},{"lineNumber":430,"author":{"gitId":"ChuaZiLong"},"content":"4. Exporting and importing operations should be completed within a reasonable time frame, not exceeding 10 seconds per operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"ChuaZiLong"},"content":"5. The application must ensure the security and privacy of private contact details during import and export operations. Data should be handled in a manner that prevents unauthorized access.","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"ChuaZiLong"},"content":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2024-03-10"},{"lineNumber":435,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"ChuaZiLong"},"content":"3. Designed for users who can type fast, making command execution quicker than using a mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"wilsonwid"},"content":"4. All operations should be able to run within 500ms measured after user input has finished.","lastModifiedDate":"2024-03-10"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":443,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"ChuaZiLong"},"content":"* **Tag**: A keyword or label assigned to a contact to categorize them based on certain criteria or characteristics. Tags allow users to filter and organize contacts more efficiently.","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"ChuaZiLong"},"content":"* **Command**: A specific instruction given by the user to the application to perform a particular operation, such as searching, exporting, or importing data.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"ChuaZiLong"},"content":"* **JSON File**: A file format that uses human-readable text to store and transmit data objects consisting of attribute-value pairs. It\u0027s used for importing and exporting contact information in the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"ChuaZiLong"},"content":"* **Filter Criteria**: The conditions or parameters (such as tag, name, or address) used to search for specific contacts within the application. These criteria help in refining search results to match the user\u0027s requirements more closely.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"ChuaZiLong"},"content":"* **Export**: The process of saving data from the application to a file, which can then be used outside the application. This can be particularly useful for creating backups or for using the contact information in other software or services.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"ChuaZiLong"},"content":"* **Import**: The process of adding or updating contacts in the application by loading them from an external file, typically in a structured format like JSON. This allows users to quickly populate the application with a large number of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"ChuaZiLong"},"content":"* **Contact Manager**: The component or feature of the application that handles the storage, retrieval, organization, and modification of contact information. It is central to the application\u0027s functionality regarding managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"ChuaZiLong"},"content":"* **Data Directory**: A specific folder or location within the system where the application stores its data files, such as contact exports or imports. The ./data/ directory is an example where JSON files might be found for import operations.","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":461,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":462,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wilsonwid":6,"-":394,"ChuaZiLong":106}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"wilsonwid"},"content":"# Student Contact Manager User Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager is a student-designed app made for students who are in need of managing their daily activities.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wilsonwid"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"wilsonwid"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"wilsonwid"},"content":"Adds a person to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"wilsonwid"},"content":"Shows a list of all persons in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"wilsonwid"},"content":"Edits an existing person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"ChuaZiLong"},"content":"### Search by tag: find_by_tag","lastModifiedDate":"2024-03-07"},{"lineNumber":135,"author":{"gitId":"ChuaZiLong"},"content":"* Finds users by tag, optionally with another filter based on their other personal details.","lastModifiedDate":"2024-03-07"},{"lineNumber":136,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":137,"author":{"gitId":"ChuaZiLong"},"content":"Format: `find_by_tag TAG [n/NAME] [a/ADDRESS]`","lastModifiedDate":"2024-03-07"},{"lineNumber":138,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":139,"author":{"gitId":"ChuaZiLong"},"content":"* `TAG` needs to be a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"ChuaZiLong"},"content":"* `NAME` needs to be a substring of a person\u0027s name","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"ChuaZiLong"},"content":"* `ADDRESS` needs to be a substring of a person\u0027s address","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"ChuaZiLong"},"content":"Example commands","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag cs2103t`","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag n/zilong`","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag a/ang mo kio avenue 10 `","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":148,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"ChuaZiLong"},"content":"### Exporting a subset of data","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"ChuaZiLong"},"content":"Exports the users that are filtered by a tag and other optional parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"ChuaZiLong"},"content":"Format: `find_and_export TAG [n/NAME] [a/ADDRESS] [o/FILENAME]`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"ChuaZiLong"},"content":"* `TAG` needs to be a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"ChuaZiLong"},"content":"* `NAME` needs to be a substring of a person\u0027s name","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"ChuaZiLong"},"content":"* `ADDRESS` needs to be a substring of a person\u0027s address","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"ChuaZiLong"},"content":"* `FILENAME` needs to be a valid filename","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"ChuaZiLong"},"content":"Example commands","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"ChuaZiLong"},"content":"* `find_and_export cs2103t`","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"ChuaZiLong"},"content":"* `find_and_export cs2103t n/john a/olive street 42 o/output1`","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"ChuaZiLong"},"content":"### Importing a datafile","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"ChuaZiLong"},"content":"Imports contact details from a JSON file with filename specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"ChuaZiLong"},"content":"Format: `import FILENAME [FILENAME_2] [FILENAME_3] …`","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"ChuaZiLong"},"content":"* `FILENAME` needs to be a valid filename that is found in the `./data/` directory","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"ChuaZiLong"},"content":"Example commands","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"ChuaZiLong"},"content":"* import export","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"ChuaZiLong"},"content":"* import contacts_export","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"ChuaZiLong"},"content":"* import contacts_export1 contacts_export2","lastModifiedDate":"2024-03-07"},{"lineNumber":175,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"wilsonwid"},"content":"Deletes the specified person from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"wilsonwid"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"wilsonwid"},"content":"Clears all entries from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":209,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-07"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"wilsonwid"},"content":"If your changes to the data file makes its format invalid, Student Contact Manager will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":215,"author":{"gitId":"wilsonwid"},"content":"Furthermore, certain edits can cause Student Contact Manager to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":216,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":218,"author":{"gitId":"wilsonwid"},"content":"### Searching by a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":219,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":220,"author":{"gitId":"wilsonwid"},"content":"### Exporting data","lastModifiedDate":"2024-03-07"},{"lineNumber":221,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":222,"author":{"gitId":"wilsonwid"},"content":"### Importing data","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager allows importing of contact data from a JSON file.","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":226,"author":{"gitId":"wilsonwid"},"content":"Format: `import FILENAME1 [FILENAME2] [FILENAME3] ...`","lastModifiedDate":"2024-03-07"},{"lineNumber":227,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":228,"author":{"gitId":"wilsonwid"},"content":"Note: The imported file needs to be placed in the same directory as the main JSON save file.","lastModifiedDate":"2024-03-07"},{"lineNumber":229,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":230,"author":{"gitId":"wilsonwid"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":231,"author":{"gitId":"wilsonwid"},"content":"* `import save_file1`","lastModifiedDate":"2024-03-07"},{"lineNumber":232,"author":{"gitId":"wilsonwid"},"content":"* `import save_file1 save_file2`","lastModifiedDate":"2024-03-07"},{"lineNumber":233,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":234,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"wilsonwid"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Student Contact Manager home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":249,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":251,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":253,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":257,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wilsonwid":31,"-":189,"ChuaZiLong":43}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eStudent Contact Manager\u003c/a\u003e","lastModifiedDate":"2024-02-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W08-3/tp/tree/master\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"wilsonwid":1,"-":66}},{"path":"docs/team/wilsonwid.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wilsonwid"},"content":"# Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wilsonwid"},"content":"## Profile/Summary","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wilsonwid"},"content":"Hello there! I\u0027m Wilson, a 3rd year Computer Science and Data Science and Analytics Double Degree student at the National University of Singapore.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wilsonwid":4}},{"path":"docs/team/zilong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"# Chua Zi Long","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"ChuaZiLong"},"content":"## Profile/Summary","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"ChuaZiLong"},"content":"Current Year 2 Computer Science and Mathematics Double Degree student from the National University of Singapore.","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":6,"author":{"gitId":"ChuaZiLong"},"content":"- Email: e0957913@u.nus.edu","lastModifiedDate":"2024-02-24"},{"lineNumber":7,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":"## EDUCATION","lastModifiedDate":"2024-02-24"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":"**National University of Singapore (NUS)**","lastModifiedDate":"2024-02-24"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"*Aug 2022 - Present*","lastModifiedDate":"2024-02-24"},{"lineNumber":11,"author":{"gitId":"ChuaZiLong"},"content":"- Double Degree in Computer Science and Mathematics","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"ChuaZiLong"},"content":"- Expected Date of Graduation: July 2027","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ChuaZiLong":12}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp/graph/badge.svg?token\u003dNSJUXEXG4R)](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp)","lastModifiedDate":"2024-02-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"wilsonwid"},"content":"* This is **a project to help make us students able to easily to manage our contacts.**\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":" * recall a classmate\u0027s project role","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":" * schedule a meeting with a study group","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"* The project aims to alleviate the common challenge of remembering and managing the myriad of connections we accumulate, especially in academic and professional settings.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"wilsonwid"},"content":" * It is **written in an object-oriented programming (OOP) fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" * It provides a user and developer guide.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wilsonwid"},"content":"* It is named `Student Contact Manager` because it helps students to store contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ChuaZiLong"},"content":"* For the detailed documentation of this project, see the **[Student Contact Manager Website](https://ay2324s2-cs2103t-w08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"ChuaZiLong"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":4,"-":5,"ChuaZiLong":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wilsonwid"},"content":"### Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wilsonwid"},"content":"\u003cimg src\u003d\"images/wilsonwid.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"wilsonwid"},"content":"[[github](https://github.com/wilsonwid)]","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"wilsonwid"},"content":"[[portfolio](team/wilsonwid.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"wilsonwid"},"content":"* Role: Team leader, Developer","lastModifiedDate":"2024-03-10"},{"lineNumber":51,"author":{"gitId":"wilsonwid"},"content":"* Responsibilities: Importing data, DevOps, User Guide, Developer Guide","lastModifiedDate":"2024-03-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"ChuaZiLong"},"content":"### Chua Zi Long","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"ChuaZiLong"},"content":"\u003cimg src\u003d\"images/chuazilong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"ChuaZiLong"},"content":"[[github](https://github.com/ChuaZiLong)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"ChuaZiLong"},"content":"[[portfolio](team/zilong.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"ChuaZiLong"},"content":"* Responsibilities: README + Site-wide Settings + Exporting Data","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"wilsonwid":6,"-":50,"ChuaZiLong":5}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wilsonwid"},"content":"* proficient with the use of a computer","lastModifiedDate":"2024-03-10"},{"lineNumber":283,"author":{"gitId":"wilsonwid"},"content":"* seeks an efficient way to manage a significant number of contacts within their academic and professional circles","lastModifiedDate":"2024-03-10"},{"lineNumber":284,"author":{"gitId":"wilsonwid"},"content":"* has a busy schedule","lastModifiedDate":"2024-03-10"},{"lineNumber":285,"author":{"gitId":"wilsonwid"},"content":"* desires an interactive and responsive app","lastModifiedDate":"2024-03-10"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"wilsonwid"},"content":"**Value proposition**: manage contacts and schedules faster and more effectively than with a normal scheduling app.","lastModifiedDate":"2024-03-10"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"wilsonwid"},"content":"| Priority | As a/an …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2024-03-11"},{"lineNumber":294,"author":{"gitId":"wilsonwid"},"content":"|----------|------------------------|------------------------------------------------------------------|------------------------------------------------------------------|","lastModifiedDate":"2024-03-11"},{"lineNumber":295,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | new user | receive help messages and instructions for using the application | learn how to use its features effectively |","lastModifiedDate":"2024-03-11"},{"lineNumber":296,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | add a new contact | |","lastModifiedDate":"2024-03-11"},{"lineNumber":297,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | delete a contact | remove entries that I no longer need |","lastModifiedDate":"2024-03-11"},{"lineNumber":298,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | edit a contact | change a person\u0027s details |","lastModifiedDate":"2024-03-11"},{"lineNumber":299,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | delete a contact | remove entries that I no longer need |","lastModifiedDate":"2024-03-11"},{"lineNumber":300,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | save contacts on the disk | store details of all my contacts |","lastModifiedDate":"2024-03-11"},{"lineNumber":301,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | list contacts | know what contacts I have |","lastModifiedDate":"2024-03-11"},{"lineNumber":302,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | search for a contact by any criteria | find their information when I need it. |","lastModifiedDate":"2024-03-11"},{"lineNumber":303,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | import contacts | easily add multiple contacts at once from another source. |","lastModifiedDate":"2024-03-11"},{"lineNumber":304,"author":{"gitId":"wilsonwid"},"content":"| `* * *` | user | export contacts | easily integrate with existing data. |","lastModifiedDate":"2024-03-11"},{"lineNumber":305,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | have my information be secure | so that my contacts are not leaked to others. |","lastModifiedDate":"2024-03-11"},{"lineNumber":306,"author":{"gitId":"wilsonwid"},"content":"| `* *` | busy user | set reminders for specific contacts | connect with them better. |","lastModifiedDate":"2024-03-11"},{"lineNumber":307,"author":{"gitId":"wilsonwid"},"content":"| `* *` | efficient user | use keyboard shortcuts for frequently-used actions | work more efficiently. |","lastModifiedDate":"2024-03-11"},{"lineNumber":308,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | track the history of interactions with specific contacts | personalize my communication and build stronger relationships. |","lastModifiedDate":"2024-03-11"},{"lineNumber":309,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | have a user-friendly interface | easily navigate the application. |","lastModifiedDate":"2024-03-11"},{"lineNumber":310,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user with many friends | know which people are in which friend groups | keep track of my friend groups. |","lastModifiedDate":"2024-03-11"},{"lineNumber":311,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | import/export my contact list in a common format | back up my data and export/import it from/to other applications. |","lastModifiedDate":"2024-03-11"},{"lineNumber":312,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | change deadlines | manage my schedule more effectively. |","lastModifiedDate":"2024-03-11"},{"lineNumber":313,"author":{"gitId":"wilsonwid"},"content":"| `* *` | forgetful user | use commands (possibly with aliases) that are easily remembered | find the application easier to use. |","lastModifiedDate":"2024-03-11"},{"lineNumber":314,"author":{"gitId":"wilsonwid"},"content":"| `*` | user | find the people I have not interacted with in a long time | maintain a good relationship with them. |","lastModifiedDate":"2024-03-11"},{"lineNumber":315,"author":{"gitId":"wilsonwid"},"content":"| `*` | user | look at the people I interact with the most | know who I spend the most time with. |","lastModifiedDate":"2024-03-11"},{"lineNumber":316,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | set data validation rules for certain fields | ensure the accuracy of my contact information. |","lastModifiedDate":"2024-03-11"},{"lineNumber":317,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | make a clear schedule of what I will do in the future | plan my schedule well. |","lastModifiedDate":"2024-03-11"},{"lineNumber":318,"author":{"gitId":"wilsonwid"},"content":"| `* *` | user | set recurring tasks or reminders associated with contacts | maintain the connections I have. |","lastModifiedDate":"2024-03-11"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"wilsonwid"},"content":"(For all use cases below, the **System** is the `Student Contact Manager` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-11"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"wilsonwid"},"content":"2. Student Contact Manager shows a list of persons","lastModifiedDate":"2024-03-11"},{"lineNumber":330,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"wilsonwid"},"content":"4. Student Contact Manager deletes the person","lastModifiedDate":"2024-03-11"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"wilsonwid"},"content":" * 3a1. Student Contact Manager shows an error message.","lastModifiedDate":"2024-03-11"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"wilsonwid"},"content":"**Use case: Finding by tag**","lastModifiedDate":"2024-03-11"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"ChuaZiLong"},"content":"1. User requests to search for users by a specific tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"ChuaZiLong"},"content":"2. The application displays a list of users who are tagged with the specified tag.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"ChuaZiLong"},"content":"3. User reviews the list to find the desired contact(s).","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"wilsonwid"},"content":"* 1a. The user enters extra spaces before or after the command.","lastModifiedDate":"2024-03-11"},{"lineNumber":360,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"wilsonwid"},"content":" * 1a1. The application automatically trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-11"},{"lineNumber":362,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"wilsonwid"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-11"},{"lineNumber":364,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"wilsonwid"},"content":"* 1b. The user specifies multiple tags or incorrect parameters.","lastModifiedDate":"2024-03-11"},{"lineNumber":366,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"wilsonwid"},"content":" * 1b1. The application shows an error message and instructions for correct input format.","lastModifiedDate":"2024-03-11"},{"lineNumber":368,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"wilsonwid"},"content":" Use case ends. ","lastModifiedDate":"2024-03-11"},{"lineNumber":370,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"wilsonwid"},"content":"* 2a. No users are found with the given tag.","lastModifiedDate":"2024-03-11"},{"lineNumber":372,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"wilsonwid"},"content":" * 2a1. The application notifies the user that no contacts were found with the specified tag.","lastModifiedDate":"2024-03-11"},{"lineNumber":374,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":375,"author":{"gitId":"wilsonwid"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":376,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":378,"author":{"gitId":"wilsonwid"},"content":"**Use case: Finding users and exporting data**","lastModifiedDate":"2024-03-11"},{"lineNumber":379,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"wilsonwid"},"content":"1. User requests to search for users by a specific tag, and optionally, by name and/or address, and wishes to export the results to a specified file.","lastModifiedDate":"2024-03-11"},{"lineNumber":383,"author":{"gitId":"ChuaZiLong"},"content":"2. The application filters the users according to the given criteria and displays the filtered list.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"wilsonwid"},"content":"3. The application exports the filtered list to the specified file.","lastModifiedDate":"2024-03-11"},{"lineNumber":385,"author":{"gitId":"ChuaZiLong"},"content":"4. The application notifies the user that the export was successful.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"wilsonwid"},"content":"* 1a. The user includes extra spaces in the command.","lastModifiedDate":"2024-03-11"},{"lineNumber":392,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":393,"author":{"gitId":"wilsonwid"},"content":" * 1a1. The application trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-11"},{"lineNumber":394,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":395,"author":{"gitId":"wilsonwid"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-11"},{"lineNumber":396,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":397,"author":{"gitId":"wilsonwid"},"content":"* 1b. The user does not specify a filename.","lastModifiedDate":"2024-03-11"},{"lineNumber":398,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":399,"author":{"gitId":"wilsonwid"},"content":" * 1b1. A default filename is used as the specified file.","lastModifiedDate":"2024-03-11"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":401,"author":{"gitId":"wilsonwid"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-11"},{"lineNumber":402,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-11"},{"lineNumber":403,"author":{"gitId":"wilsonwid"},"content":"* 2a. No users match the given criteria.","lastModifiedDate":"2024-03-11"},{"lineNumber":404,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"wilsonwid"},"content":" * 2a1. The application alerts the user that no matching contacts were found.","lastModifiedDate":"2024-03-11"},{"lineNumber":406,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"ChuaZiLong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"wilsonwid"},"content":"* 3a. The user specifies an invalid filename or multiple filenames.","lastModifiedDate":"2024-03-11"},{"lineNumber":410,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"wilsonwid"},"content":" * 3a1. The application shows an error message regarding the filename issue.","lastModifiedDate":"2024-03-11"},{"lineNumber":412,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"ChuaZiLong"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"wilsonwid"},"content":"**Use case: Importing contacts**","lastModifiedDate":"2024-03-11"},{"lineNumber":418,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"ChuaZiLong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"wilsonwid"},"content":"1. User requests to import contacts from one or multiple JSON files located in the `./data/` directory.","lastModifiedDate":"2024-03-11"},{"lineNumber":422,"author":{"gitId":"ChuaZiLong"},"content":"2. The application validates the existence and format of the specified file(s).","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"ChuaZiLong"},"content":"3. The application imports the contacts from the file(s) into the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"ChuaZiLong"},"content":"4. The application notifies the user that the import was successful.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"ChuaZiLong"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"ChuaZiLong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"wilsonwid"},"content":"* 1a. The user includes extra spaces in the command.","lastModifiedDate":"2024-03-11"},{"lineNumber":431,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"wilsonwid"},"content":" * 1a1. The application trims the extra spaces and processes the command.","lastModifiedDate":"2024-03-11"},{"lineNumber":433,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"wilsonwid"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-11"},{"lineNumber":435,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"wilsonwid"},"content":"* 2a. One or more specified files do not exist in the ./data/ directory.","lastModifiedDate":"2024-03-11"},{"lineNumber":437,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"wilsonwid"},"content":" * 2a1. The application informs the user which files could not be found.","lastModifiedDate":"2024-03-11"},{"lineNumber":439,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"ChuaZiLong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"wilsonwid"},"content":"* 2b. One or more files are not in the correct JSON format.","lastModifiedDate":"2024-03-11"},{"lineNumber":443,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"wilsonwid"},"content":" * 2b1. The application notifies the user which files have format issues.","lastModifiedDate":"2024-03-11"},{"lineNumber":445,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"wilsonwid"},"content":" Use case ends.","lastModifiedDate":"2024-03-11"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"ChuaZiLong"},"content":"3. Designed for users who can type fast, making command execution quicker than using a mouse.","lastModifiedDate":"2024-02-24"},{"lineNumber":453,"author":{"gitId":"wilsonwid"},"content":"4. Exporting and importing operations should be completed within a reasonable time frame, not exceeding 2 seconds per operation.","lastModifiedDate":"2024-03-11"},{"lineNumber":454,"author":{"gitId":"wilsonwid"},"content":"5. All other operations should be completed within 500ms, measured after the user has entered an input.","lastModifiedDate":"2024-03-11"},{"lineNumber":455,"author":{"gitId":"wilsonwid"},"content":"6. The application must ensure the security and privacy of private contact details during import and export operations. Data should be handled in a manner that prevents unauthorized access.","lastModifiedDate":"2024-03-11"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":460,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"ChuaZiLong"},"content":"* **Tag**: A keyword or label assigned to a contact to categorize them based on certain criteria or characteristics. Tags allow users to filter and organize contacts more efficiently.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"ChuaZiLong"},"content":"* **Command**: A specific instruction given by the user to the application to perform a particular operation, such as searching, exporting, or importing data.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"ChuaZiLong"},"content":"* **JSON File**: A file format that uses human-readable text to store and transmit data objects consisting of attribute-value pairs. It\u0027s used for importing and exporting contact information in the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"ChuaZiLong"},"content":"* **Filter Criteria**: The conditions or parameters (such as tag, name, or address) used to search for specific contacts within the application. These criteria help in refining search results to match the user\u0027s requirements more closely.","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"ChuaZiLong"},"content":"* **Export**: The process of saving data from the application to a file, which can then be used outside the application. This can be particularly useful for creating backups or for using the contact information in other software or services.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"ChuaZiLong"},"content":"* **Import**: The process of adding or updating contacts in the application by loading them from an external file, typically in a structured format like JSON. This allows users to quickly populate the application with a large number of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"ChuaZiLong"},"content":"* **Contact Manager**: The component or feature of the application that handles the storage, retrieval, organization, and modification of contact information. It is central to the application\u0027s functionality regarding managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"wilsonwid"},"content":"* **Data Directory**: A specific folder or location within the system where the application stores its data files, such as contact exports or imports. The `./data/` directory is an example where JSON files might be found for import operations.","lastModifiedDate":"2024-03-11"},{"lineNumber":469,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":477,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":478,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wilsonwid":79,"-":377,"ChuaZiLong":66}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"wilsonwid"},"content":"# Student Contact Manager User Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager is a student-designed app made for students who are in need of managing their daily activities.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wilsonwid"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"wilsonwid"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"wilsonwid"},"content":"Adds a person to the Student Contact Manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"wilsonwid"},"content":"Shows a list of all persons in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"wilsonwid"},"content":"Edits an existing person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"wilsonwid"},"content":"### Search by tag: `find_by_tag`","lastModifiedDate":"2024-03-11"},{"lineNumber":135,"author":{"gitId":"ChuaZiLong"},"content":"* Finds users by tag, optionally with another filter based on their other personal details.","lastModifiedDate":"2024-03-07"},{"lineNumber":136,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":137,"author":{"gitId":"ChuaZiLong"},"content":"Format: `find_by_tag TAG [n/NAME] [a/ADDRESS]`","lastModifiedDate":"2024-03-07"},{"lineNumber":138,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":139,"author":{"gitId":"ChuaZiLong"},"content":"* `TAG` needs to be a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"ChuaZiLong"},"content":"* `NAME` needs to be a substring of a person\u0027s name","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"ChuaZiLong"},"content":"* `ADDRESS` needs to be a substring of a person\u0027s address","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"wilsonwid"},"content":"Examples:","lastModifiedDate":"2024-03-11"},{"lineNumber":144,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag cs2103t`","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag n/zilong`","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"ChuaZiLong"},"content":"* `find_by_tag a/ang mo kio avenue 10 `","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-10"},{"lineNumber":148,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"wilsonwid"},"content":"### Exporting a subset of data: `find_and_export`","lastModifiedDate":"2024-03-11"},{"lineNumber":150,"author":{"gitId":"ChuaZiLong"},"content":"Exports the users that are filtered by a tag and other optional parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"ChuaZiLong"},"content":"Format: `find_and_export TAG [n/NAME] [a/ADDRESS] [o/FILENAME]`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"ChuaZiLong"},"content":"* `TAG` needs to be a tag","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"ChuaZiLong"},"content":"* `NAME` needs to be a substring of a person\u0027s name","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"ChuaZiLong"},"content":"* `ADDRESS` needs to be a substring of a person\u0027s address","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"ChuaZiLong"},"content":"* `FILENAME` needs to be a valid filename","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"wilsonwid"},"content":"Examples:","lastModifiedDate":"2024-03-11"},{"lineNumber":160,"author":{"gitId":"ChuaZiLong"},"content":"* `find_and_export cs2103t`","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"ChuaZiLong"},"content":"* `find_and_export cs2103t n/john a/olive street 42 o/output1`","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"wilsonwid"},"content":"### Importing a datafile: `import`","lastModifiedDate":"2024-03-11"},{"lineNumber":165,"author":{"gitId":"ChuaZiLong"},"content":"Imports contact details from a JSON file with filename specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"wilsonwid"},"content":"Format: `import f/FILENAME_1 [f/FILENAME_2] [f/FILENAME_3] …`","lastModifiedDate":"2024-03-11"},{"lineNumber":168,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"wilsonwid"},"content":"* `FILENAME_n` needs to be a valid filename that is found in the `./data/` directory","lastModifiedDate":"2024-03-11"},{"lineNumber":170,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"wilsonwid"},"content":"Examples:","lastModifiedDate":"2024-03-11"},{"lineNumber":172,"author":{"gitId":"ChuaZiLong"},"content":"* import export","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"ChuaZiLong"},"content":"* import contacts_export","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"ChuaZiLong"},"content":"* import contacts_export1 contacts_export2","lastModifiedDate":"2024-03-07"},{"lineNumber":175,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"wilsonwid"},"content":"Deletes the specified person from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"wilsonwid"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"wilsonwid"},"content":"Clears all entries from the contact manager.","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":209,"author":{"gitId":"wilsonwid"},"content":"Student Contact Manager data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-07"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"wilsonwid"},"content":"If your changes to the data file makes its format invalid, Student Contact Manager will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":215,"author":{"gitId":"wilsonwid"},"content":"Furthermore, certain edits can cause Student Contact Manager to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-07"},{"lineNumber":216,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":218,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"wilsonwid"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Student Contact Manager home folder.","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":229,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":231,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":233,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"wilsonwid"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-11"},{"lineNumber":236,"author":{"gitId":"wilsonwid"},"content":"|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-11"},{"lineNumber":237,"author":{"gitId":"wilsonwid"},"content":"| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` |","lastModifiedDate":"2024-03-11"},{"lineNumber":238,"author":{"gitId":"wilsonwid"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-03-11"},{"lineNumber":239,"author":{"gitId":"wilsonwid"},"content":"| **Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3` |","lastModifiedDate":"2024-03-11"},{"lineNumber":240,"author":{"gitId":"wilsonwid"},"content":"| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG] ...`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com` |","lastModifiedDate":"2024-03-11"},{"lineNumber":241,"author":{"gitId":"wilsonwid"},"content":"| **Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake` |","lastModifiedDate":"2024-03-11"},{"lineNumber":242,"author":{"gitId":"wilsonwid"},"content":"| **List** | `list` |","lastModifiedDate":"2024-03-11"},{"lineNumber":243,"author":{"gitId":"wilsonwid"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-03-11"},{"lineNumber":244,"author":{"gitId":"wilsonwid"},"content":"| **find_by_tag** | `find_by_tag TAG [n/NAME] [a/ADDRESS]` |","lastModifiedDate":"2024-03-11"},{"lineNumber":245,"author":{"gitId":"wilsonwid"},"content":"| **find_and_export** | `find_and_export TAG [n/NAME] [a/ADDRESS] [o/FILENAME]` |","lastModifiedDate":"2024-03-11"},{"lineNumber":246,"author":{"gitId":"wilsonwid"},"content":"| **import** | `import f/FILENAME_1 [f/FILENAME_2] [f/FILENAME_3] ...` |","lastModifiedDate":"2024-03-11"}],"authorContributionMap":{"wilsonwid":35,"-":176,"ChuaZiLong":35}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eStudent Contact Manager\u003c/a\u003e","lastModifiedDate":"2024-02-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"wilsonwid"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W08-3/tp/tree/master\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"wilsonwid":1,"-":66}},{"path":"docs/team/wilsonwid.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wilsonwid"},"content":"# Wilson Widyadhana","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wilsonwid"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wilsonwid"},"content":"## Profile/Summary","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wilsonwid"},"content":"Hello there! I\u0027m Wilson, a 3rd year Computer Science and Data Science and Analytics Double Degree student at the National University of Singapore.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wilsonwid":4}},{"path":"docs/team/zilong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"# Chua Zi Long","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"ChuaZiLong"},"content":"## Profile/Summary","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"ChuaZiLong"},"content":"Current Year 2 Computer Science and Mathematics Double Degree student from the National University of Singapore.","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":6,"author":{"gitId":"ChuaZiLong"},"content":"- Email: e0957913@u.nus.edu","lastModifiedDate":"2024-02-24"},{"lineNumber":7,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":"## EDUCATION","lastModifiedDate":"2024-02-24"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":"**National University of Singapore (NUS)**","lastModifiedDate":"2024-02-24"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"*Aug 2022 - Present*","lastModifiedDate":"2024-02-24"},{"lineNumber":11,"author":{"gitId":"ChuaZiLong"},"content":"- Double Degree in Computer Science and Mathematics","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"ChuaZiLong"},"content":"- Expected Date of Graduation: July 2027","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ChuaZiLong":12}}] diff --git a/AY2324S2-CS2103T-W08-3_tp_master/commits.json b/AY2324S2-CS2103T-W08-3_tp_master/commits.json index 5c8e738b..91db1eac 100644 --- a/AY2324S2-CS2103T-W08-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W08-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"wilsonwid":[{"date":"2024-03-06","commitResults":[{"hash":"919ce8137e880425033368ee7c4b8e81e7e36aba","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZiLong/master","messageBody":" Update README, AboutUs and personal information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"153718103fc909e4e3a483f9eb55ee7749f12942","isMergeCommit":false,"messageTitle":"Add README changes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"4ea83ef080603f2e0712c84f3607eb7c638791ef","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"64fc99e8acc484cc86476013d4c0c27f82dd40b6","isMergeCommit":false,"messageTitle":"Add UG importing","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":15}}}]},{"date":"2024-03-10","commitResults":[{"hash":"d33bc0a74ca74305cdbefb61620c955017fd45ec","isMergeCommit":false,"messageTitle":"Add personal info to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":20}}},{"hash":"59ba78a0c2ac0550deef2f29add36a89d203141e","isMergeCommit":false,"messageTitle":"Fix formatting issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"198b689bd04775113b9d621c6a7b6495bd6fef5a","isMergeCommit":false,"messageTitle":"Update github link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8af499e926fb2097a3fc95206230a7a07cbea45b","isMergeCommit":true,"messageTitle":"Merge pull request #22 from wilsonwid/wilsonwid-readme","messageBody":"Add documentation","fileTypesAndContributionMap":{}},{"hash":"de94a88c0345e231922965a12bcf908e30b0b865","isMergeCommit":true,"messageTitle":"Merge pull request #20 from ChuaZiLong/master","messageBody":"Update the UG and DG","fileTypesAndContributionMap":{}}]}],"tahsinhasem":[],"ChuaZiLong":[{"date":"2024-02-24","commitResults":[{"hash":"892055b872ab3d2d97bec1035b8e1292c9217efe","isMergeCommit":false,"messageTitle":"Update AboutUs for Zi Long","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":5}}},{"hash":"93dcc3608304f90af44bf6046a8e256334678340","isMergeCommit":false,"messageTitle":"Update README based on the requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"781406def87aa814bfb544d6047f16fcc816790f","isMergeCommit":false,"messageTitle":"Update target user profile and NFRs in the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"71edabba66e4c1e3912b27ad34f806a6eab321fb","isMergeCommit":false,"messageTitle":"Add new lines to the end of the files to comply with standards","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":2},"test-code":{"insertions":1,"deletions":1}}},{"hash":"825c92d164f73cddc0bef90f268e6f37467767b3","isMergeCommit":false,"messageTitle":"Add a new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"601065e0dc069e4dc68c89eeaad93680025f9f00","isMergeCommit":false,"messageTitle":"Correct code standards for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":21,"deletions":20}}},{"hash":"d1a085ede0626e367ec09ecd1a9d27ae08664d8b","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":51,"deletions":9}}},{"hash":"b423ed5d621f4fde5819ccfce54a440fe36f3f82","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"c1efcc7cbf5c4ae31df51eecb380b078777c29bc","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1}}},{"hash":"0fcb6af4c7cdabfe69e3de80d1a30863c5bf67ae","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"ce8ddefcf75b69c586f005135ba4470c982db787","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":1,"deletions":1}}},{"hash":"91e913530efc4b379676abca9979da10893639be","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":2,"deletions":2}}},{"hash":"4ef99d62582852f33eb70b6ed5c7de496692c33e","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a71e2038f147da2ef743ad5b8ba83799487fe183","isMergeCommit":false,"messageTitle":"Update README, AboutUs and personal information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":13}}},{"hash":"44d23f80316ec3d35ad6497856af3b2ec3a7b4d7","isMergeCommit":false,"messageTitle":"Add new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"803eefa59d4185da362df006f54c1f594c890e30","isMergeCommit":false,"messageTitle":"Change path in aboutus to my picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"fe379b250589eeb3b82354f085c488f852b7f624","isMergeCommit":false,"messageTitle":"Update the UG and DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":183,"deletions":0}}}]},{"date":"2024-03-10","commitResults":[{"hash":"a79089205cbfc9f56310d65f7eda9ac2ff1cf1b6","isMergeCommit":true,"messageTitle":"Remove unnecessary stuff from the UG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"44e6dbc64821d6c049c306d2d00298b56d2b3ad5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1488b3e3c28b750a2492932be0c0241a783d66e9","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}},{"hash":"bcb91a22d4c26137f22021ead2bc99ee1190ea11","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/ChuaZiLong/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c0521d737736ae517abd7b071e748cf951c7b049","isMergeCommit":false,"messageTitle":"Pull to sync with local then remove unnecessary stuff from the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":12}}},{"hash":"4cd009af1dedd61a384bd97af5e649b8f3d9103f","isMergeCommit":false,"messageTitle":"Undo changes due to the week 6 code tracing exercise","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":55,"deletions":305},"test-code":{"insertions":19,"deletions":112}}},{"hash":"e4bb9aea06e9b99225e1414a727098cbefbebd84","isMergeCommit":false,"messageTitle":"Add white space at EOF","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7},"test-code":{"insertions":2,"deletions":2}}},{"hash":"f1b3c96d1110ea22694752092aacd9bc02928276","isMergeCommit":false,"messageTitle":"Add white space at EOF","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":2,"deletions":2}}},{"hash":"280e9b5529a5f654533f520fcf8d84396b636a45","isMergeCommit":false,"messageTitle":"Add whitespace at EOF","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"e2d427fa059fe85cf89056baa986787defb73606","isMergeCommit":false,"messageTitle":"Correct indentation in some files","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":37,"deletions":37}}},{"hash":"c99368484cbb65a3288532492ba178e63af92674","isMergeCommit":false,"messageTitle":"Comment out untested code to pass checkstyle temporarily","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":3}}},{"hash":"eb91e8d819ca6f4da51e610e32e9adef20cfff0f","isMergeCommit":false,"messageTitle":"Comment out import statements to temporarily pass code coverage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}},{"hash":"258cfa9b87bcc79234ea4dd340aba8e99383e8d5","isMergeCommit":false,"messageTitle":"Remove untested code to temporarily pass code coverage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":20}}},{"hash":"a2dc4db58f669d9371fa7c2c00ecbabaa5dafce5","isMergeCommit":false,"messageTitle":"Revert files to before week 6 tracing code","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":11}}},{"hash":"205f9dc554b7a5c8aca0ff69568bd65fd2edca99","isMergeCommit":false,"messageTitle":"Add whitespace to EOF for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":3}}},{"hash":"befcc5389f3fcba85e80a94ba20204b22652caab","isMergeCommit":false,"messageTitle":"Fix indentation for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":6}}},{"hash":"b5ea5cfc79c89cd6bef2cbbb0f063204f1ebc411","isMergeCommit":false,"messageTitle":"Copy files from team\u0027s remote repo","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":8}}},{"hash":"4e6e0cae9810b987306b9b0651463206e428bb00","isMergeCommit":false,"messageTitle":"Update indentation in a file to match team repo","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":18,"deletions":18}}},{"hash":"344ee87f5d2a926f909b4f57b8ed2b2dac2bf28b","isMergeCommit":false,"messageTitle":"Add whitespace at EOF for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":2}}},{"hash":"baf6aa19d3c6401e86f174244ffbbad599b2817f","isMergeCommit":false,"messageTitle":"Fix indentation in a file","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":2}}}]}],"sarjinius":[]},"authorFileTypeContributionMap":{"wilsonwid":{"docs":52,"functional-code":0,"test-code":0},"tahsinhasem":{"docs":0,"functional-code":0,"test-code":0},"ChuaZiLong":{"docs":172,"functional-code":0,"test-code":0},"sarjinius":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"wilsonwid":318.9481,"tahsinhasem":0.0,"ChuaZiLong":32382.338,"sarjinius":0.0},"authorDisplayNameMap":{"wilsonwid":"CS2103T-W08-3 WILS..HANA","tahsinhasem":"CS2103T-W08-3 AONI..ASEM","ChuaZiLong":"CS2103T-W08-3 CHUA..LONG","sarjinius":"CS2103T-W08-3 SARJ..BONA"}} +{"authorDailyContributionsMap":{"wilsonwid":[{"date":"2024-03-06","commitResults":[{"hash":"919ce8137e880425033368ee7c4b8e81e7e36aba","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZiLong/master","messageBody":" Update README, AboutUs and personal information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"153718103fc909e4e3a483f9eb55ee7749f12942","isMergeCommit":false,"messageTitle":"Add README changes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"4ea83ef080603f2e0712c84f3607eb7c638791ef","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"64fc99e8acc484cc86476013d4c0c27f82dd40b6","isMergeCommit":false,"messageTitle":"Add UG importing","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":15}}}]},{"date":"2024-03-10","commitResults":[{"hash":"d33bc0a74ca74305cdbefb61620c955017fd45ec","isMergeCommit":false,"messageTitle":"Add personal info to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":20}}},{"hash":"59ba78a0c2ac0550deef2f29add36a89d203141e","isMergeCommit":false,"messageTitle":"Fix formatting issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"198b689bd04775113b9d621c6a7b6495bd6fef5a","isMergeCommit":false,"messageTitle":"Update github link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8af499e926fb2097a3fc95206230a7a07cbea45b","isMergeCommit":true,"messageTitle":"Merge pull request #22 from wilsonwid/wilsonwid-readme","messageBody":"Add documentation","fileTypesAndContributionMap":{}},{"hash":"de94a88c0345e231922965a12bcf908e30b0b865","isMergeCommit":true,"messageTitle":"Merge pull request #20 from ChuaZiLong/master","messageBody":"Update the UG and DG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-11","commitResults":[{"hash":"ab893d5f38655ff083d4ab322237736b618c1098","isMergeCommit":false,"messageTitle":"Update DG formatting and content","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":48,"deletions":45}}},{"hash":"f19ce87a289d3961d2779113a6b4b7efd3cd663d","isMergeCommit":false,"messageTitle":"Update UG with content","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":26}}},{"hash":"eaaf1dc794d719e6fd573de0b3f82a461c870163","isMergeCommit":false,"messageTitle":"Add DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":12}}},{"hash":"6c23d92b27cd8c64231cceba28b6e4a198ebb66e","isMergeCommit":false,"messageTitle":"Update DG with user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":30}}},{"hash":"c75f5c784a2333ffa887cd9d34cc6301f6fba5ce","isMergeCommit":false,"messageTitle":"Delete redundant line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"cd7300c79b99066d3a155f18db42266cef97d8be","isMergeCommit":false,"messageTitle":"Update format of import statement","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}}]},{"date":"2024-03-12","commitResults":[{"hash":"351e1117fc52278d5cb30db5ca962da12391dfc4","isMergeCommit":true,"messageTitle":"Merge pull request #52 from wilsonwid/wilsonwid-docs","messageBody":"Update formatting of DG and UG","fileTypesAndContributionMap":{}}]}],"tahsinhasem":[],"ChuaZiLong":[{"date":"2024-02-24","commitResults":[{"hash":"892055b872ab3d2d97bec1035b8e1292c9217efe","isMergeCommit":false,"messageTitle":"Update AboutUs for Zi Long","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":5}}},{"hash":"93dcc3608304f90af44bf6046a8e256334678340","isMergeCommit":false,"messageTitle":"Update README based on the requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"781406def87aa814bfb544d6047f16fcc816790f","isMergeCommit":false,"messageTitle":"Update target user profile and NFRs in the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"71edabba66e4c1e3912b27ad34f806a6eab321fb","isMergeCommit":false,"messageTitle":"Add new lines to the end of the files to comply with standards","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":2},"test-code":{"insertions":1,"deletions":1}}},{"hash":"825c92d164f73cddc0bef90f268e6f37467767b3","isMergeCommit":false,"messageTitle":"Add a new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"601065e0dc069e4dc68c89eeaad93680025f9f00","isMergeCommit":false,"messageTitle":"Correct code standards for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":21,"deletions":20}}},{"hash":"d1a085ede0626e367ec09ecd1a9d27ae08664d8b","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":51,"deletions":9}}},{"hash":"b423ed5d621f4fde5819ccfce54a440fe36f3f82","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"c1efcc7cbf5c4ae31df51eecb380b078777c29bc","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1}}},{"hash":"0fcb6af4c7cdabfe69e3de80d1a30863c5bf67ae","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"ce8ddefcf75b69c586f005135ba4470c982db787","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":1,"deletions":1}}},{"hash":"91e913530efc4b379676abca9979da10893639be","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":2,"deletions":2}}},{"hash":"4ef99d62582852f33eb70b6ed5c7de496692c33e","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a71e2038f147da2ef743ad5b8ba83799487fe183","isMergeCommit":false,"messageTitle":"Update README, AboutUs and personal information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":13}}},{"hash":"44d23f80316ec3d35ad6497856af3b2ec3a7b4d7","isMergeCommit":false,"messageTitle":"Add new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"803eefa59d4185da362df006f54c1f594c890e30","isMergeCommit":false,"messageTitle":"Change path in aboutus to my picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"fe379b250589eeb3b82354f085c488f852b7f624","isMergeCommit":false,"messageTitle":"Update the UG and DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":183,"deletions":0}}}]},{"date":"2024-03-10","commitResults":[{"hash":"a79089205cbfc9f56310d65f7eda9ac2ff1cf1b6","isMergeCommit":true,"messageTitle":"Remove unnecessary stuff from the UG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"44e6dbc64821d6c049c306d2d00298b56d2b3ad5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1488b3e3c28b750a2492932be0c0241a783d66e9","isMergeCommit":false,"messageTitle":"Update code to comply with checkstyle","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}},{"hash":"bcb91a22d4c26137f22021ead2bc99ee1190ea11","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/ChuaZiLong/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c0521d737736ae517abd7b071e748cf951c7b049","isMergeCommit":false,"messageTitle":"Pull to sync with local then remove unnecessary stuff from the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":12}}},{"hash":"4cd009af1dedd61a384bd97af5e649b8f3d9103f","isMergeCommit":false,"messageTitle":"Undo changes due to the week 6 code tracing exercise","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":55,"deletions":305},"test-code":{"insertions":19,"deletions":112}}},{"hash":"e4bb9aea06e9b99225e1414a727098cbefbebd84","isMergeCommit":false,"messageTitle":"Add white space at EOF","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7},"test-code":{"insertions":2,"deletions":2}}},{"hash":"f1b3c96d1110ea22694752092aacd9bc02928276","isMergeCommit":false,"messageTitle":"Add white space at EOF","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":2,"deletions":2}}},{"hash":"280e9b5529a5f654533f520fcf8d84396b636a45","isMergeCommit":false,"messageTitle":"Add whitespace at EOF","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"e2d427fa059fe85cf89056baa986787defb73606","isMergeCommit":false,"messageTitle":"Correct indentation in some files","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":37,"deletions":37}}},{"hash":"c99368484cbb65a3288532492ba178e63af92674","isMergeCommit":false,"messageTitle":"Comment out untested code to pass checkstyle temporarily","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":3}}},{"hash":"eb91e8d819ca6f4da51e610e32e9adef20cfff0f","isMergeCommit":false,"messageTitle":"Comment out import statements to temporarily pass code coverage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}},{"hash":"258cfa9b87bcc79234ea4dd340aba8e99383e8d5","isMergeCommit":false,"messageTitle":"Remove untested code to temporarily pass code coverage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":20}}},{"hash":"a2dc4db58f669d9371fa7c2c00ecbabaa5dafce5","isMergeCommit":false,"messageTitle":"Revert files to before week 6 tracing code","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":11}}},{"hash":"205f9dc554b7a5c8aca0ff69568bd65fd2edca99","isMergeCommit":false,"messageTitle":"Add whitespace to EOF for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":3}}},{"hash":"befcc5389f3fcba85e80a94ba20204b22652caab","isMergeCommit":false,"messageTitle":"Fix indentation for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":6}}},{"hash":"b5ea5cfc79c89cd6bef2cbbb0f063204f1ebc411","isMergeCommit":false,"messageTitle":"Copy files from team\u0027s remote repo","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":8}}},{"hash":"4e6e0cae9810b987306b9b0651463206e428bb00","isMergeCommit":false,"messageTitle":"Update indentation in a file to match team repo","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":18,"deletions":18}}},{"hash":"344ee87f5d2a926f909b4f57b8ed2b2dac2bf28b","isMergeCommit":false,"messageTitle":"Add whitespace at EOF for checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":2}}},{"hash":"baf6aa19d3c6401e86f174244ffbbad599b2817f","isMergeCommit":false,"messageTitle":"Fix indentation in a file","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":2}}}]}],"sarjinius":[]},"authorFileTypeContributionMap":{"wilsonwid":{"docs":129,"functional-code":0,"test-code":0},"tahsinhasem":{"docs":0,"functional-code":0,"test-code":0},"ChuaZiLong":{"docs":124,"functional-code":0,"test-code":0},"sarjinius":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"wilsonwid":3377.5012,"tahsinhasem":0.0,"ChuaZiLong":29410.678,"sarjinius":0.0},"authorDisplayNameMap":{"wilsonwid":"CS2103T-W08-3 WILS..HANA","tahsinhasem":"CS2103T-W08-3 AONI..ASEM","ChuaZiLong":"CS2103T-W08-3 CHUA..LONG","sarjinius":"CS2103T-W08-3 SARJ..BONA"}} diff --git a/archive.zip b/archive.zip index 80ee2e0601326f2ef684ba47b8fa413576058182..a71a73739537ed82526729aa30cfe3739e3cdda3 100644 GIT binary patch delta 352055 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

xmcSUabMGsE%pH)8v)fB2J!crVznxO#I|x7zbz- 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

L3?lx%S_A~jlQV<=H&44vVhe7Jk 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

  • tmUAB}_u0kun%%Zp|Nd_&d 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 delta 276974 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

    3pMtm7d3~R@ksQccvHJz1^;bnxwqk4= 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�H+jB86|={LKO{grb?m68Jcd|?Bd}M~KsC{R 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�vS7C9WBAL<^C2H^wPJdPHq=w3>kFnZ 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%0AAOtdyymItLz^etm79l5b0`NbT{zOe0r-8JuNZMU zM@rF(3 z9iJC3F$k~y;Iq{!bdRtBYGNYh$H zrL}|6F505bm)uq%jMm$yR>S$z?j+j
    ;}M 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
    9)_T=5r3&Ud%O_+2@H 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 I@&D&&u9a6p~opn$-ne-WM@6xp!h0;dR-6e7w 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ℜlF@28 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 diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 3d20eed1..90faaf6c 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,50 +1,50 @@ -Mar 11, 2024 2:16:09 PM reposense.system.LogsManager addFileHandler +Mar 12, 2024 12:49:52 AM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Mar 11, 2024 2:16:10 PM reposense.parser.CsvParser validateHeader +Mar 12, 2024 12:49:52 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, repo-config.csv, and recognized columns: Ignore Standalone Config, Repository's Location, Branch, Shallow Cloning, File formats, Ignore Glob List, Ignore Authors List, Find Previous Authors, Ignore Commits List -Mar 11, 2024 2:16:10 PM reposense.parser.RepoConfigCsvParser matchValueAndKeyword +Mar 12, 2024 12:49:52 AM reposense.parser.RepoConfigCsvParser matchValueAndKeyword WARNING: Ignoring unknown value 02a7620d1ed1d78c4ed314a67cf8c359a5a97dc5;ca7ce2d5c002a436dfccc9621a3de79fb140f5c5;92f90c348b0741617ace600a4e405bbe681dd795;d2fecfe583c1c351929ad4e6afc900bcc96f45d8;7e6624f484ea788645ed2d42d34fed57a06976a6;b524367f655bd758f95a7ac73e32c35b3d0219c5;66dcd0ed0a3f94a90b339936a8421aa03eb959e0;2c111e93c9140e523e532aba953f58457561867d;beae79deffcbbdef42f3222a0d937ff4f3961f40;f539c5095bde90a01fd591b0ad5c1d633f3c07b3;ce0abf71c5163b5c97539a960017c1cb7f524243;6376848908a5ab36696cc3b233ab1d4050a1a375;21de2ce55fcc9ffe1f188da7c67b05cbbcfef840;72cbb26bf7d664fdc845206ba97c62d5dc4b4c2b;a69eccecfb02e23360f2286bf626c5ddb08dc62d;360564cb5892ae1c758678718ae0b6ce27a0c8e3 in yes column. -Mar 11, 2024 2:16:10 PM reposense.parser.CsvParser validateHeader +Mar 12, 2024 12:49:52 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, author-config.csv, and recognized columns: Author's Emails, Repository's Location, Author's GitHub ID, Branch, Author's Display Name, Ignore Glob List, Author's Git Author Name -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias chen wenlong found. The alias will belong to the last author - c-wenlong -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias liu jiayao found. The alias will belong to the last author - ljy0422 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias liu jiayao found. The alias will belong to the last author - ljy0422 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias chen wenlong found. The alias will belong to the last author - c-wenlong -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 11, 2024 2:16:10 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 12, 2024 12:49:52 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 11, 2024 2:16:10 PM reposense.parser.CsvParser validateHeader +Mar 12, 2024 12:49:52 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, group-config.csv, and recognized columns: Globs, Repository's Location, Group Name -Mar 11, 2024 2:16:10 PM reposense.git.GitConfig getGlobalGitLfsConfig +Mar 12, 2024 12:49:52 AM reposense.git.GitConfig getGlobalGitLfsConfig WARNING: Could not get global git lfs config java.lang.RuntimeException: reposense.system.CommandRunnerProcessException: Error returned from command git config --global --list on path . : fatal: unable to read config file '/home/runner/.gitconfig': No such file or directory @@ -60,1663 +60,1663 @@ fatal: unable to read config file '/home/runner/.gitconfig': No such file or dir at reposense.system.CommandRunner.runCommand(CommandRunner.java:21) ... 3 more -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-3/tp.git... -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-2/tp.git... -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-3/tp.git... +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... -Mar 11, 2024 2:16:10 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git to complete... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... +Mar 12, 2024 12:49:52 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git completed! -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-3/tp.git... -Mar 11, 2024 2:16:11 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:49:54 AM reposense.report.ReportGenerator analyzeRepos INFO: [1/92] Analyzing https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git to complete... -Mar 11, 2024 2:16:11 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:49:54 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:49:54 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-4/tp.git... -Mar 11, 2024 2:16:11 PM reposense.report.ReportGenerator analyzeRepos -INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:54 AM reposense.report.ReportGenerator analyzeRepos +INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git to complete... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:54 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:49:54 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 12, 2024 12:49:54 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 12, 2024 12:49:54 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-2/tp.git... -Mar 11, 2024 2:16:11 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:49:54 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! +Mar 12, 2024 12:49:54 AM reposense.report.ReportGenerator analyzeRepos INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:54 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-2/tp.git... +Mar 12, 2024 12:49:55 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git to complete... -Mar 11, 2024 2:16:11 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... -Mar 11, 2024 2:16:11 PM reposense.report.ReportGenerator analyzeRepos -INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 11, 2024 2:16:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... -Mar 11, 2024 2:16:11 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:49:55 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:49:55 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 11, 2024 2:16:12 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 11, 2024 2:16:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 11, 2024 2:16:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 11, 2024 2:16:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:49:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 12, 2024 12:49:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! +Mar 12, 2024 12:49:55 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 12, 2024 12:49:55 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... +Mar 12, 2024 12:49:55 AM reposense.report.ReportGenerator analyzeRepos +INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 12, 2024 12:49:55 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! +Mar 12, 2024 12:49:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... +Mar 12, 2024 12:49:55 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:49:55 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 12, 2024 12:49:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 11, 2024 2:16:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 11, 2024 2:16:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:49:55 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:49:55 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! -Mar 11, 2024 2:16:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator analyzeRepos +INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git to complete... -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:49:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator analyzeRepos INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:49:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 11, 2024 2:16:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... -Mar 11, 2024 2:16:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! +Mar 12, 2024 12:49:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! -Mar 11, 2024 2:16:14 PM reposense.report.ReportGenerator analyzeRepos -INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... +Mar 12, 2024 12:49:56 AM reposense.report.ReportGenerator analyzeRepos +INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 12, 2024 12:49:56 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:49:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... -Mar 11, 2024 2:16:14 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator analyzeRepos +INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... -Mar 11, 2024 2:16:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:49:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 12, 2024 12:49:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! -Mar 11, 2024 2:16:14 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) completed! -Mar 11, 2024 2:16:14 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! -Mar 11, 2024 2:16:14 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! -Mar 11, 2024 2:16:14 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... -Mar 11, 2024 2:16:14 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator analyzeRepos INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 11, 2024 2:16:14 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... -Mar 11, 2024 2:16:14 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:49:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) completed! +Mar 12, 2024 12:49:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:49:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 11, 2024 2:16:15 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! -Mar 11, 2024 2:16:15 PM reposense.report.ReportGenerator analyzeRepos -INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 11, 2024 2:16:15 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... -Mar 11, 2024 2:16:15 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator analyzeRepos +INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 12, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... -Mar 11, 2024 2:16:15 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:49:57 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:49:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 11, 2024 2:16:15 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 11, 2024 2:16:15 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:49:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 11, 2024 2:16:15 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 11, 2024 2:16:15 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! -Mar 11, 2024 2:16:15 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-2/tp.git... -Mar 11, 2024 2:16:16 PM reposense.report.ReportGenerator analyzeRepos -INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git to complete... -Mar 11, 2024 2:16:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:49:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 11, 2024 2:16:16 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:49:58 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) completed! -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! -Mar 11, 2024 2:16:16 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:49:59 AM reposense.report.ReportGenerator analyzeRepos +INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-2/tp.git... +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git to complete... +Mar 12, 2024 12:49:59 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:49:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-1/tp.git... -Mar 11, 2024 2:16:16 PM reposense.report.ReportGenerator analyzeRepos -INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:59 AM reposense.report.ReportGenerator analyzeRepos +INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git to complete... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:59 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:49:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git completed! -Mar 11, 2024 2:16:16 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... -Mar 11, 2024 2:16:16 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:49:59 AM reposense.report.ReportGenerator analyzeRepos INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... +Mar 12, 2024 12:49:59 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... -Mar 11, 2024 2:16:16 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:49:59 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:49:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 11, 2024 2:16:16 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... -Mar 11, 2024 2:16:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 11, 2024 2:16:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:49:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 12, 2024 12:50:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 12, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! +Mar 12, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! +Mar 12, 2024 12:50:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 11, 2024 2:16:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 11, 2024 2:16:17 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! -Mar 11, 2024 2:16:17 PM reposense.report.ReportGenerator analyzeRepos -INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 11, 2024 2:16:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:00 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... +Mar 12, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepos +INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 12, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... +Mar 12, 2024 12:50:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 12, 2024 12:50:00 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 12, 2024 12:50:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 11, 2024 2:16:17 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! -Mar 11, 2024 2:16:17 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git completed! -Mar 11, 2024 2:16:17 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepos INFO: [15/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 11, 2024 2:16:17 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... -Mar 11, 2024 2:16:17 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git to complete... -Mar 11, 2024 2:16:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 11, 2024 2:16:17 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:17 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! -Mar 11, 2024 2:16:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-3/tp.git... -Mar 11, 2024 2:16:18 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... -Mar 11, 2024 2:16:18 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepos INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... -Mar 11, 2024 2:16:18 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... -Mar 11, 2024 2:16:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... -Mar 11, 2024 2:16:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! -Mar 11, 2024 2:16:18 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 12, 2024 12:50:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepos INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... +Mar 12, 2024 12:50:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 11, 2024 2:16:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 12, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! +Mar 12, 2024 12:50:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 12, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! +Mar 12, 2024 12:50:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 12, 2024 12:50:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 12, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! +Mar 12, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! +Mar 12, 2024 12:50:02 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... +Mar 12, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepos INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... +Mar 12, 2024 12:50:02 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! -Mar 11, 2024 2:16:19 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! +Mar 12, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepos INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:02 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-1/tp.git... -Mar 11, 2024 2:16:19 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:02 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... +Mar 12, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepos +INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 12, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... +Mar 12, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git to complete... -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:03 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:03 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 12, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! -Mar 11, 2024 2:16:19 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... -Mar 11, 2024 2:16:19 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... -Mar 11, 2024 2:16:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 11, 2024 2:16:19 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! -Mar 11, 2024 2:16:20 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! -Mar 11, 2024 2:16:20 PM reposense.report.ReportGenerator analyzeRepos -INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 11, 2024 2:16:20 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:03 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... -Mar 11, 2024 2:16:20 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... -Mar 11, 2024 2:16:20 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 12, 2024 12:50:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 12, 2024 12:50:03 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! +Mar 12, 2024 12:50:03 AM reposense.report.ReportGenerator analyzeRepos +INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 12, 2024 12:50:03 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:20 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 11, 2024 2:16:20 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! -Mar 11, 2024 2:16:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 11, 2024 2:16:20 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... -Mar 11, 2024 2:16:20 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... -Mar 11, 2024 2:16:20 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 11, 2024 2:16:20 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! -Mar 11, 2024 2:16:20 PM reposense.report.ReportGenerator analyzeRepos -INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 11, 2024 2:16:20 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:20 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 11, 2024 2:16:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... -Mar 11, 2024 2:16:21 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 11, 2024 2:16:21 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... -Mar 11, 2024 2:16:21 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepos INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 11, 2024 2:16:21 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:21 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! -Mar 11, 2024 2:16:21 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... -Mar 11, 2024 2:16:21 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... -Mar 11, 2024 2:16:22 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! -Mar 11, 2024 2:16:22 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepos INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:22 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! -Mar 11, 2024 2:16:22 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... -Mar 11, 2024 2:16:22 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... -Mar 11, 2024 2:16:22 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! -Mar 11, 2024 2:16:22 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepos +INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... +Mar 12, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... +Mar 12, 2024 12:50:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.report.ReportGenerator analyzeRepos -INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:22 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 11, 2024 2:16:22 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! -Mar 11, 2024 2:16:22 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... -Mar 11, 2024 2:16:23 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... -Mar 11, 2024 2:16:23 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:04 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 12, 2024 12:50:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator analyzeRepos -INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! -Mar 11, 2024 2:16:23 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... -Mar 11, 2024 2:16:23 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git to complete... -Mar 11, 2024 2:16:23 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... -Mar 11, 2024 2:16:23 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... -Mar 11, 2024 2:16:23 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! -Mar 11, 2024 2:16:23 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator analyzeRepos -INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator analyzeRepos -INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 12, 2024 12:50:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 12, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! +Mar 12, 2024 12:50:05 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! +Mar 12, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepos +INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 12, 2024 12:50:05 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... +Mar 12, 2024 12:50:05 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... +Mar 12, 2024 12:50:05 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:05 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! +Mar 12, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepos +INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 12, 2024 12:50:06 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... +Mar 12, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... +Mar 12, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! +Mar 12, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepos +INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 12, 2024 12:50:06 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... +Mar 12, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... +Mar 12, 2024 12:50:06 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 11, 2024 2:16:23 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-4/tp.git... -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git to complete... -Mar 11, 2024 2:16:24 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 11, 2024 2:16:24 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! -Mar 11, 2024 2:16:24 PM reposense.report.ReportGenerator analyzeRepos -INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 11, 2024 2:16:24 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:06 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:24 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 11, 2024 2:16:24 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:06 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... -Mar 11, 2024 2:16:24 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 11, 2024 2:16:24 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... -Mar 11, 2024 2:16:24 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:06 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 12, 2024 12:50:06 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 11, 2024 2:16:24 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) completed! -Mar 11, 2024 2:16:24 PM reposense.report.ReportGenerator analyzeRepos -INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! -Mar 11, 2024 2:16:25 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator analyzeRepos -INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... -Mar 11, 2024 2:16:25 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... -Mar 11, 2024 2:16:25 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:06 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator analyzeRepos -INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:06 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 12, 2024 12:50:06 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 12, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! +Mar 12, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! +Mar 12, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepos +INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 12, 2024 12:50:07 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... +Mar 12, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... +Mar 12, 2024 12:50:07 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! +Mar 12, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepos +INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 12, 2024 12:50:07 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... +Mar 12, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git to complete... +Mar 12, 2024 12:50:07 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 12, 2024 12:50:07 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 12, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! +Mar 12, 2024 12:50:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 12, 2024 12:50:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 12, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! +Mar 12, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! +Mar 12, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepos +INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 12, 2024 12:50:08 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... +Mar 12, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... +Mar 12, 2024 12:50:08 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:08 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 12, 2024 12:50:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 12, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! +Mar 12, 2024 12:50:08 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-4/tp.git... +Mar 12, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepos +INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 12, 2024 12:50:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! -Mar 11, 2024 2:16:25 PM reposense.report.ReportGenerator analyzeRepos -INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git to complete... +Mar 12, 2024 12:50:08 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:08 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 12, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! +Mar 12, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepos +INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 12, 2024 12:50:09 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... +Mar 12, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... +Mar 12, 2024 12:50:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 12, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! +Mar 12, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepos +INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 12, 2024 12:50:09 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... +Mar 12, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... +Mar 12, 2024 12:50:09 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:26 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! -Mar 11, 2024 2:16:26 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-2/tp.git... -Mar 11, 2024 2:16:26 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git to complete... -Mar 11, 2024 2:16:26 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! -Mar 11, 2024 2:16:26 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... -Mar 11, 2024 2:16:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! -Mar 11, 2024 2:16:26 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... -Mar 11, 2024 2:16:26 PM reposense.report.ReportGenerator analyzeRepos -INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! -Mar 11, 2024 2:16:26 PM reposense.report.ReportGenerator analyzeRepos -INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 12, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! +Mar 12, 2024 12:50:09 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:26 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:26 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 11, 2024 2:16:26 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 11, 2024 2:16:27 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 11, 2024 2:16:27 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! -Mar 11, 2024 2:16:27 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! -Mar 11, 2024 2:16:27 PM reposense.report.ReportGenerator analyzeRepos -INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 11, 2024 2:16:27 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... -Mar 11, 2024 2:16:27 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... -Mar 11, 2024 2:16:27 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! +Mar 12, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepos +INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 12, 2024 12:50:10 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... +Mar 12, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... +Mar 12, 2024 12:50:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 12, 2024 12:50:10 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 12, 2024 12:50:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 12, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! +Mar 12, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! +Mar 12, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepos +INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 12, 2024 12:50:10 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-2/tp.git... +Mar 12, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git to complete... +Mar 12, 2024 12:50:10 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 12, 2024 12:50:11 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! +Mar 12, 2024 12:50:11 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... +Mar 12, 2024 12:50:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 12, 2024 12:50:11 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... +Mar 12, 2024 12:50:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 12, 2024 12:50:11 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:27 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 11, 2024 2:16:27 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 12, 2024 12:50:11 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! -Mar 11, 2024 2:16:27 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepos +INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... +Mar 12, 2024 12:50:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! +Mar 12, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepos +INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... -Mar 11, 2024 2:16:27 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... -Mar 11, 2024 2:16:27 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:12 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner spawnCloneProcess +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! +Mar 12, 2024 12:50:12 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner waitForCloneProcess +Mar 12, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... -Mar 11, 2024 2:16:28 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 11, 2024 2:16:28 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 11, 2024 2:16:28 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! -Mar 11, 2024 2:16:28 PM reposense.report.ReportGenerator analyzeRepos -INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 11, 2024 2:16:28 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:28 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... -Mar 11, 2024 2:16:28 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... -Mar 11, 2024 2:16:29 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 11, 2024 2:16:29 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git completed! -Mar 11, 2024 2:16:29 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 11, 2024 2:16:29 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... -Mar 11, 2024 2:16:29 PM reposense.report.ReportGenerator analyzeRepos -INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git to complete... -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! -Mar 11, 2024 2:16:29 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 11, 2024 2:16:29 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! -Mar 11, 2024 2:16:29 PM reposense.report.ReportGenerator analyzeRepos -INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 11, 2024 2:16:29 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-2/tp.git... -Mar 11, 2024 2:16:30 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git to complete... -Mar 11, 2024 2:16:30 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:30 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 11, 2024 2:16:30 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:30 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 11, 2024 2:16:30 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 11, 2024 2:16:30 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 11, 2024 2:16:30 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! -Mar 11, 2024 2:16:30 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepos INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 11, 2024 2:16:31 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 11, 2024 2:16:31 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:31 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:13 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 11, 2024 2:16:31 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 11, 2024 2:16:31 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... -Mar 11, 2024 2:16:31 PM reposense.report.ReportGenerator analyzeRepos -INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... -Mar 11, 2024 2:16:31 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:31 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... -Mar 11, 2024 2:16:31 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... -Mar 11, 2024 2:16:32 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 11, 2024 2:16:32 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 11, 2024 2:16:32 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! -Mar 11, 2024 2:16:32 PM reposense.report.ReportGenerator analyzeRepos -INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 11, 2024 2:16:32 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 11, 2024 2:16:32 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:32 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 11, 2024 2:16:32 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! -Mar 11, 2024 2:16:32 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... -Mar 11, 2024 2:16:32 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... -Mar 11, 2024 2:16:32 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! -Mar 11, 2024 2:16:32 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... -Mar 11, 2024 2:16:32 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... -Mar 11, 2024 2:16:32 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepos +INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 12, 2024 12:50:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 11, 2024 2:16:33 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! -Mar 11, 2024 2:16:33 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:13 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 12, 2024 12:50:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 11, 2024 2:16:33 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... -Mar 11, 2024 2:16:33 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! -Mar 11, 2024 2:16:33 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... -Mar 11, 2024 2:16:33 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! -Mar 11, 2024 2:16:33 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... -Mar 11, 2024 2:16:33 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! +Mar 12, 2024 12:50:13 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! +Mar 12, 2024 12:50:13 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... +Mar 12, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepos +INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 12, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... +Mar 12, 2024 12:50:14 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 12, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git completed! +Mar 12, 2024 12:50:14 AM reposense.report.ReportGenerator analyzeRepos INFO: [42/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 11, 2024 2:16:33 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... -Mar 11, 2024 2:16:33 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:14 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... +Mar 12, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git to complete... +Mar 12, 2024 12:50:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 12, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! +Mar 12, 2024 12:50:14 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... +Mar 12, 2024 12:50:14 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:33 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 11, 2024 2:16:33 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 11, 2024 2:16:33 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! -Mar 11, 2024 2:16:33 PM reposense.report.ReportGenerator analyzeRepos -INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 11, 2024 2:16:33 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... +Mar 12, 2024 12:50:15 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! +Mar 12, 2024 12:50:15 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-2/tp.git... +Mar 12, 2024 12:50:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! +Mar 12, 2024 12:50:15 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git to complete... +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepos +INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 12, 2024 12:50:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 12, 2024 12:50:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 11, 2024 2:16:33 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! +Mar 12, 2024 12:50:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepos +INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator analyzeRepos -INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... -Mar 11, 2024 2:16:34 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator analyzeRepos -INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator analyzeRepos -INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... -Mar 11, 2024 2:16:34 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:16 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! +Mar 12, 2024 12:50:16 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepos +INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 11, 2024 2:16:34 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! -Mar 11, 2024 2:16:35 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... -Mar 11, 2024 2:16:35 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... -Mar 11, 2024 2:16:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 11, 2024 2:16:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 11, 2024 2:16:35 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! -Mar 11, 2024 2:16:35 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepos +INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepos INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 11, 2024 2:16:35 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... +Mar 12, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:35 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 11, 2024 2:16:35 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! -Mar 11, 2024 2:16:35 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... -Mar 11, 2024 2:16:35 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... -Mar 11, 2024 2:16:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 11, 2024 2:16:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:16 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 12, 2024 12:50:16 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 12, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! +Mar 12, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepos +INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 12, 2024 12:50:17 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 12, 2024 12:50:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 12, 2024 12:50:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! -Mar 11, 2024 2:16:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 12, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! +Mar 12, 2024 12:50:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 12, 2024 12:50:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator analyzeRepos -INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator analyzeRepos -INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... -Mar 11, 2024 2:16:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 12, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepos +INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepos +INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepos +INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... -Mar 11, 2024 2:16:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator analyzeRepos -INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! -Mar 11, 2024 2:16:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... +Mar 12, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... -Mar 11, 2024 2:16:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... -Mar 11, 2024 2:16:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) completed! -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator analyzeRepos -INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator analyzeRepos -INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:37 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... -Mar 11, 2024 2:16:37 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... -Mar 11, 2024 2:16:37 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepos +INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:37 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! -Mar 11, 2024 2:16:37 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... -Mar 11, 2024 2:16:37 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... -Mar 11, 2024 2:16:37 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! -Mar 11, 2024 2:16:37 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! +Mar 12, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepos INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! -Mar 11, 2024 2:16:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... +Mar 12, 2024 12:50:19 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... -Mar 11, 2024 2:16:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! -Mar 11, 2024 2:16:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! +Mar 12, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepos INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator analyzeRepos -INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... +Mar 12, 2024 12:50:19 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! -Mar 11, 2024 2:16:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... -Mar 11, 2024 2:16:38 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... -Mar 11, 2024 2:16:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! -Mar 11, 2024 2:16:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 11, 2024 2:16:38 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! +Mar 12, 2024 12:50:19 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... +Mar 12, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepos +INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 12, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 12, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepos INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:20 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... +Mar 12, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... +Mar 12, 2024 12:50:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 12, 2024 12:50:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator analyzeRepos -INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:39 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:39 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! -Mar 11, 2024 2:16:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator analyzeRepos -INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! -Mar 11, 2024 2:16:39 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:39 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! -Mar 11, 2024 2:16:39 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... -Mar 11, 2024 2:16:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! -Mar 11, 2024 2:16:39 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator analyzeRepos -INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... -Mar 11, 2024 2:16:39 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:39 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 11, 2024 2:16:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git completed! -Mar 11, 2024 2:16:40 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... -Mar 11, 2024 2:16:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! +Mar 12, 2024 12:50:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... -Mar 11, 2024 2:16:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator analyzeRepos -INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) completed! -Mar 11, 2024 2:16:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator analyzeRepos -INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator analyzeRepos -INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! +Mar 12, 2024 12:50:20 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepos +INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 12, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... +Mar 12, 2024 12:50:20 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepos +INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepos +INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! -Mar 11, 2024 2:16:40 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-3/tp.git... -Mar 11, 2024 2:16:40 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 11, 2024 2:16:40 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git to complete... -Mar 11, 2024 2:16:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-2/tp.git... -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git to complete... -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! -Mar 11, 2024 2:16:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... -Mar 11, 2024 2:16:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... -Mar 11, 2024 2:16:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator analyzeRepos -INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator analyzeRepos -INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! +Mar 12, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepos +INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... +Mar 12, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... +Mar 12, 2024 12:50:22 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 12, 2024 12:50:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 12, 2024 12:50:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 12, 2024 12:50:22 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! +Mar 12, 2024 12:50:22 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! +Mar 12, 2024 12:50:22 AM reposense.report.ReportGenerator analyzeRepos +INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 12, 2024 12:50:22 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... +Mar 12, 2024 12:50:22 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... +Mar 12, 2024 12:50:22 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 12, 2024 12:50:23 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! +Mar 12, 2024 12:50:23 AM reposense.report.ReportGenerator analyzeRepos +INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 12, 2024 12:50:23 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... +Mar 12, 2024 12:50:23 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... +Mar 12, 2024 12:50:23 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator analyzeRepos -INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! +Mar 12, 2024 12:50:24 AM reposense.report.ReportGenerator analyzeRepos +INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 12, 2024 12:50:24 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... +Mar 12, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... +Mar 12, 2024 12:50:24 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-3/tp.git... -Mar 11, 2024 2:16:41 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... -Mar 11, 2024 2:16:41 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! -Mar 11, 2024 2:16:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... -Mar 11, 2024 2:16:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... -Mar 11, 2024 2:16:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 11, 2024 2:16:42 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! -Mar 11, 2024 2:16:42 PM reposense.report.ReportGenerator analyzeRepos -INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 11, 2024 2:16:43 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! -Mar 11, 2024 2:16:43 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 11, 2024 2:16:43 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... -Mar 11, 2024 2:16:43 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... -Mar 11, 2024 2:16:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... -Mar 11, 2024 2:16:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:24 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 11, 2024 2:16:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:24 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 11, 2024 2:16:44 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:24 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! -Mar 11, 2024 2:16:44 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! +Mar 12, 2024 12:50:24 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... +Mar 12, 2024 12:50:24 AM reposense.report.ReportGenerator analyzeRepos +INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 12, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... +Mar 12, 2024 12:50:25 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 12, 2024 12:50:25 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! +Mar 12, 2024 12:50:25 AM reposense.report.ReportGenerator analyzeRepos +INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 12, 2024 12:50:25 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... +Mar 12, 2024 12:50:25 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... +Mar 12, 2024 12:50:25 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 12, 2024 12:50:26 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 12, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! +Mar 12, 2024 12:50:26 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... +Mar 12, 2024 12:50:26 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 12, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git completed! +Mar 12, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... +Mar 12, 2024 12:50:26 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... +Mar 12, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... +Mar 12, 2024 12:50:26 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 12, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! +Mar 12, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepos +INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 12, 2024 12:50:26 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 12, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! +Mar 12, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepos INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 11, 2024 2:16:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git completed! -Mar 11, 2024 2:16:45 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... -Mar 11, 2024 2:16:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git to complete... -Mar 11, 2024 2:16:45 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 11, 2024 2:16:45 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:26 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 11, 2024 2:16:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:26 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 12, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! +Mar 12, 2024 12:50:27 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-3/tp.git... +Mar 12, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git to complete... +Mar 12, 2024 12:50:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 12, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! +Mar 12, 2024 12:50:27 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-2/tp.git... +Mar 12, 2024 12:50:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 12, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! +Mar 12, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git to complete... +Mar 12, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepos +INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 12, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! +Mar 12, 2024 12:50:28 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... +Mar 12, 2024 12:50:28 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 12, 2024 12:50:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 12, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... +Mar 12, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! +Mar 12, 2024 12:50:28 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-3/tp.git... +Mar 12, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... +Mar 12, 2024 12:50:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 11, 2024 2:16:45 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 12, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! -Mar 11, 2024 2:16:45 PM reposense.report.ReportGenerator analyzeRepos -INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 11, 2024 2:16:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! -Mar 11, 2024 2:16:45 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-3/tp.git... -Mar 11, 2024 2:16:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git to complete... -Mar 11, 2024 2:16:45 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepos +INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 12, 2024 12:50:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 12, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! +Mar 12, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepos +INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 12, 2024 12:50:28 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 11, 2024 2:16:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! -Mar 11, 2024 2:16:46 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... -Mar 11, 2024 2:16:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... -Mar 11, 2024 2:16:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 11, 2024 2:16:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! -Mar 11, 2024 2:16:46 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... -Mar 11, 2024 2:16:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 11, 2024 2:16:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... -Mar 11, 2024 2:16:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 11, 2024 2:16:46 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! -Mar 11, 2024 2:16:46 PM reposense.report.ReportGenerator analyzeRepos -INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 11, 2024 2:16:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 11, 2024 2:16:46 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! -Mar 11, 2024 2:16:47 PM reposense.report.ReportGenerator analyzeRepos -INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 11, 2024 2:16:47 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:28 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 11, 2024 2:16:47 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! -Mar 11, 2024 2:16:47 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... -Mar 11, 2024 2:16:47 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... -Mar 11, 2024 2:16:47 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 11, 2024 2:16:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! +Mar 12, 2024 12:50:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 11, 2024 2:16:47 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! -Mar 11, 2024 2:16:47 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... -Mar 11, 2024 2:16:47 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... -Mar 11, 2024 2:16:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... +Mar 12, 2024 12:50:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... +Mar 12, 2024 12:50:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 11, 2024 2:16:47 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! -Mar 11, 2024 2:16:47 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepos INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! -Mar 11, 2024 2:16:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git completed! -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... -Mar 11, 2024 2:16:48 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepos +INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 12, 2024 12:50:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 11, 2024 2:16:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 11, 2024 2:16:48 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! -Mar 11, 2024 2:16:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 11, 2024 2:16:48 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 12, 2024 12:50:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... +Mar 12, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepos +INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 12, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... +Mar 12, 2024 12:50:30 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:30 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... -Mar 11, 2024 2:16:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... -Mar 11, 2024 2:16:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! -Mar 11, 2024 2:16:49 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... -Mar 11, 2024 2:16:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... -Mar 11, 2024 2:16:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! -Mar 11, 2024 2:16:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 11, 2024 2:16:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! -Mar 11, 2024 2:16:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:30 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! +Mar 12, 2024 12:50:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 11, 2024 2:16:49 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:30 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! -Mar 11, 2024 2:16:49 PM reposense.report.ReportGenerator analyzeRepos -INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 11, 2024 2:16:49 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! -Mar 11, 2024 2:16:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:30 AM reposense.report.ReportGenerator analyzeRepos INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:30 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! +Mar 12, 2024 12:50:31 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... +Mar 12, 2024 12:50:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... +Mar 12, 2024 12:50:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 12, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! +Mar 12, 2024 12:50:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! -Mar 11, 2024 2:16:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepos +INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 12, 2024 12:50:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator analyzeRepos -INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator analyzeRepos -INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git completed! +Mar 12, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepos +INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... +Mar 12, 2024 12:50:31 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git to complete... +Mar 12, 2024 12:50:31 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 12, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! +Mar 12, 2024 12:50:32 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-3/tp.git... +Mar 12, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git to complete... +Mar 12, 2024 12:50:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 12, 2024 12:50:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 12, 2024 12:50:33 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! +Mar 12, 2024 12:50:33 AM reposense.report.ReportGenerator analyzeRepos +INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 12, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! +Mar 12, 2024 12:50:33 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... +Mar 12, 2024 12:50:33 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 11, 2024 2:16:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... +Mar 12, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! +Mar 12, 2024 12:50:33 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... +Mar 12, 2024 12:50:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... +Mar 12, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 12, 2024 12:50:34 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! +Mar 12, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator analyzeRepos -INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:34 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... +Mar 12, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:34 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... +Mar 12, 2024 12:50:34 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 12, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! +Mar 12, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:34 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! +Mar 12, 2024 12:50:34 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... +Mar 12, 2024 12:50:34 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... +Mar 12, 2024 12:50:34 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 11, 2024 2:16:51 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 12, 2024 12:50:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepos INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:35 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git completed! +Mar 12, 2024 12:50:35 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... +Mar 12, 2024 12:50:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 12, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! +Mar 12, 2024 12:50:35 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... +Mar 12, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepos +INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 12, 2024 12:50:35 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:35 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 12, 2024 12:50:35 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! +Mar 12, 2024 12:50:35 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... +Mar 12, 2024 12:50:35 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... +Mar 12, 2024 12:50:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 12, 2024 12:50:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 12, 2024 12:50:36 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! +Mar 12, 2024 12:50:36 AM reposense.report.ReportGenerator analyzeRepos +INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 12, 2024 12:50:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:36 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) completed! -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! +Mar 12, 2024 12:50:36 AM reposense.report.ReportGenerator analyzeRepos +INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 12, 2024 12:50:36 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... +Mar 12, 2024 12:50:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... +Mar 12, 2024 12:50:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! +Mar 12, 2024 12:50:36 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... +Mar 12, 2024 12:50:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... +Mar 12, 2024 12:50:36 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:36 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 12, 2024 12:50:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! +Mar 12, 2024 12:50:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 12, 2024 12:50:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator analyzeRepos INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! -Mar 11, 2024 2:16:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! -Mar 11, 2024 2:16:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator analyzeRepos +INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 12, 2024 12:50:37 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! +Mar 12, 2024 12:50:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! +Mar 12, 2024 12:50:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:37 AM reposense.report.ReportGenerator analyzeRepos +INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 12, 2024 12:50:37 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! +Mar 12, 2024 12:50:37 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepos INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) completed! +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepos INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) completed! -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepos -INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepos +INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepos -INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepos +INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepos INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! -Mar 11, 2024 2:16:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepos +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. +Mar 12, 2024 12:50:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepos INFO: [92/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 11, 2024 2:16:53 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! -Mar 11, 2024 2:16:54 PM reposense.report.ReportGenerator updateRepoConfig +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) does not contain a standalone config file. -Mar 11, 2024 2:16:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 12, 2024 12:50:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 11, 2024 2:16:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 11, 2024 2:16:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 11, 2024 2:16:54 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) completed! -Mar 11, 2024 2:16:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 12, 2024 12:50:38 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! +Mar 12, 2024 12:50:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 11, 2024 2:16:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... +Mar 12, 2024 12:50:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 11, 2024 2:16:54 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:39 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! -Mar 11, 2024 2:16:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 12, 2024 12:50:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... +Mar 12, 2024 12:50:39 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) completed! +Mar 12, 2024 12:50:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 11, 2024 2:16:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 12, 2024 12:50:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 11, 2024 2:16:56 PM reposense.report.ReportGenerator analyzeRepo +Mar 12, 2024 12:50:41 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) completed! -Mar 11, 2024 2:16:56 PM reposense.report.ReportGenerator generateReposReport +Mar 12, 2024 12:50:41 AM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/tp-dashboard/tp-dashboard/reposense-report -Mar 11, 2024 2:16:56 PM reposense.RepoSense main -INFO: Elapsed processing time: 46.93 second(s) +Mar 12, 2024 12:50:41 AM reposense.RepoSense main +INFO: Elapsed processing time: 49.46 second(s) diff --git a/summary.json b/summary.json index 2996a25d..f22d3e66 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Mon Mar 11 22:16:10 2024 UTC+08:00","reportGenerationTime":" 46.46 second(s)","zoneId":"UTC+08:00","reportTitle":"CS2103 tP Code Dashboard","repos":[{"location":{"location":"https://github.com/AY2324S2-CS2103-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103-T14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-1_tp_master"}],"errorSet":[],"sinceDate":"2024-02-23","untilDate":"2024-03-11","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}} +{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Tue Mar 12 08:49:52 2024 UTC+08:00","reportGenerationTime":" 48.97 second(s)","zoneId":"UTC+08:00","reportTitle":"CS2103 tP Code Dashboard","repos":[{"location":{"location":"https://github.com/AY2324S2-CS2103-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103-T14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-1_tp_master"}],"errorSet":[],"sinceDate":"2024-02-23","untilDate":"2024-03-12","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}}